标签: string-interning

关于字符串实习表现的问题

我很好奇.该场景是一个Web应用程序/站点,例如100个并发连接和每秒许多(20?)页面加载.

如果应用需要服务器格式化的字符串

string.Format("Hello, {0}", username);
Run Code Online (Sandbox Code Playgroud)

"Hello,{0}"会被实习吗?或者它只会被实习

string hello = "Hello, {0}";
string.Format(hello, username);
Run Code Online (Sandbox Code Playgroud)

就实习而言,这将提供更好的表现:以上或,

StringBuilder builder = new StringBuilder()
builder.Append("Hello, ");
builder.Append(username);
Run Code Online (Sandbox Code Playgroud)

甚至

string hello = "Hello, {0}";
StringBuilder builder = new StringBuilder()
builder.Append("Hello, ");
builder.Append(username);
Run Code Online (Sandbox Code Playgroud)

所以我的主要问题是:1)是否会对string.Format文字进行实习2)是否值得为字符串构建器设置变量名以进行快速查找,或者3)查找本身是否相当繁重(如果上面的#1是否为)

我意识到这可能会带来微小的收益,但正如我所说,我很好奇.

.net c# performance string-interning

3
推荐指数
1
解决办法
714
查看次数

重复文字和硬编码

我发现以下模式经常发生:

 b->last = ngx_cpymem(b->last, "</pre><hr>", sizeof("</pre><hr>") - 1);
Run Code Online (Sandbox Code Playgroud)

请注意,文字字符串使用了两次.提取物来自nginx源库.

在编译单元中遇到这些文字时,编译器应该能够合并这些文字.

我的问题是:

  1. 当在编译单元中遇到时,商业级编译器(VC++,GCC,LLVM/Clang)是否会删除此冗余?
  2. 链接目标文件时,(静态)链接器是否会删除此类冗余.
  3. 如果2适用,这种优化会在动态链接期间发生吗?
  4. 如果1和2适用,它们是否适用于所有文字.

这些问题很重要,因为它允许程序员在不损失效率的情况下进行冗长 - 即,考虑将大量静态数据模型硬连接到程序中(例如,某些低级方案中使用的决策支持系统的规则) .

编辑

2分/澄清

  1. 上面的代码由公认的"主"程序员编写.这家伙一手写了nginx.

  2. 我没有问过文字硬编码的哪种可能机制更好.所以不要偏离主题.

编辑2

我最初的例子是非常人为的和限制性的.以下代码段显示了嵌入到内部硬编码知识中的字符串文字的用法.第一个片段用于配置解析器告诉它为哪个字符串设置哪个枚举值,第二个片段通常用作程序中的字符串.我个人对此感到满意,只要编译器使用字符串文字的一个副本,并且由于元素是静态的,它们不会进入全局符号表.

static ngx_conf_bitmask_t  ngx_http_gzip_proxied_mask[] = {
   { ngx_string("off"), NGX_HTTP_GZIP_PROXIED_OFF },
   { ngx_string("expired"), NGX_HTTP_GZIP_PROXIED_EXPIRED },
   { ngx_string("no-cache"), NGX_HTTP_GZIP_PROXIED_NO_CACHE },
   { ngx_string("no-store"), NGX_HTTP_GZIP_PROXIED_NO_STORE },
   { ngx_string("private"), NGX_HTTP_GZIP_PROXIED_PRIVATE },
   { ngx_string("no_last_modified"), NGX_HTTP_GZIP_PROXIED_NO_LM },
   { ngx_string("no_etag"), NGX_HTTP_GZIP_PROXIED_NO_ETAG },
   { ngx_string("auth"), NGX_HTTP_GZIP_PROXIED_AUTH },
   { ngx_string("any"), NGX_HTTP_GZIP_PROXIED_ANY },
   { ngx_null_string, 0 }
};
Run Code Online (Sandbox Code Playgroud)

紧随其后:

static ngx_str_t  ngx_http_gzip_no_cache = ngx_string("no-cache");
static ngx_str_t  ngx_http_gzip_no_store …
Run Code Online (Sandbox Code Playgroud)

c c++ compiler-theory micro-optimization string-interning

3
推荐指数
3
解决办法
1451
查看次数

序列化时是否保留Interned Strings?

如果我有包含许多重复字符串的大对象图,那么在序列化它们之前对字符串进行实际的()是否有好处呢?这会减少传输的数据量吗?字符串会在接收端共享指针吗?

我的猜测是在发送之前将对字符串进行去除,从而减小数据的大小,并且它们将全部由接收端上的相同对象表示,但它们实际上不会在接收端被实现.(意味着每个序列化'事务'上会创建一个新的字符串实例)

java serializable string-interning

3
推荐指数
2
解决办法
1291
查看次数

String.Intern有值吗?

String.Intern 有一个特殊的字符串池,以后可以检索.

有没有办法让我知道指定的字符串从池中获取的,并且是否是新创建的?例如:

string s1 = "MyTest"; 
string s2 = new StringBuilder().Append("My").Append("Test").ToString(); 
string s3 = String.Intern(s2); 
Console.WriteLine((Object)s2==(Object)s1); // Different references.
Console.WriteLine((Object)s3==(Object)s1); // The same reference.
Run Code Online (Sandbox Code Playgroud)

S3参考VAL 从池中取出

有什么办法让我知道吗?

.net c# string-interning

3
推荐指数
1
解决办法
104
查看次数

序列化器上的字符串Intern.Deserialize &lt;T&gt;()

我目前正在使用json.net反序列化对象大小中等的字符串。总共约7000个项目。

每个项目都有一个由4个相同的字符串组成的循环组,在内存配置文件中,这会根据嵌套等内容创建约40,000个引用。

有没有办法让序列化程序对每个相同的字符串使用相同的引用?

示例Json:

  [{
    "name":"jon bones",
    "groups":[{
        "groupName":"Region",
        "code":"1"
    },{
        "groupName":"Class",
        "code":"4"
    }]
},
{
    "name":"Swan moans",
    "groups":[{
        "groupName":"Region",
        "code":"12"
    },{
        "groupName":"Class",
        "code":"1"
    }]
}]
Run Code Online (Sandbox Code Playgroud)

添加了示例。如您所见,groupName值几乎在所有对象上都重复。只是相关代码发生了变化。这不是一个很大的问题,但是随着数据集的增长,我宁愿不要增加过多的分配。

也可能看起来像“代码”可能重复,但这对每个人来说都是唯一的。基本上是同一对象的多个标识符。

c# json json.net string-interning

3
推荐指数
1
解决办法
731
查看次数

为什么使用append或者不同的StringBuilder的str == str.intern()的结果?

All.I有一个像这样的java代码片段:

 String a = new StringBuilder("app").append("le").toString();
 System.out.println(a.intern() == a);
 String b = new StringBuilder("orange").toString();
 System.out.println(b.intern() == b);
Run Code Online (Sandbox Code Playgroud)

这个java代码将输出true,false.我想知道为什么.谢谢大家.

java string stringbuilder string-interning

3
推荐指数
1
解决办法
388
查看次数

Python 2和3兼容的方式来调用intern()

如何编写使用Python的代码,intern它将与Python 2和Python 3兼容(兼容)?有干净的方法吗?

在Python 2中,实习生是内置的,所以你使用intern().在Python 3中,它已被移动到sys模块中,因此您应该使用它sys.intern().它似乎intern()适用于Python 2但不适用于Python 3,sys.intern()适用于Python 3但不适用于Python 2.是否有任何干净的语法可以在Python 2和Python 3上运行,而不使用版本检测(丑陋)?

python python-2.x string-interning python-3.x

3
推荐指数
1
解决办法
305
查看次数

const char 编译器优化

我在两个不同的文件中有全局常量字符定义:

f1:

const char foo1[] = "SAME_VALUE";
Run Code Online (Sandbox Code Playgroud)

f2:

const char foo2[] = "SAME_VALUE";
Run Code Online (Sandbox Code Playgroud)

想了解在最终的二进制文件中是否会对其进行优化以占用内存中的公共空间。这是在海湾合作委员会的背景下

c compiler-optimization string-interning

3
推荐指数
1
解决办法
133
查看次数

我们可以避免在java中实习字符串吗?

我们可以完全禁用字符串的实习.它可能不是真的有用,但只是一个想法.我可以想到至少有一点可以提供帮助,即在jvm调整期间,控制perm gen的大小.

例如,如果我给出一个OSGI框架,任何人都可以添加任意数量的自己的捆绑包,每个捆绑字符串实习可以完全搞砸我的调整参数.(当然我知道我们应该对给定的固定发行版进行调整,但仍然......)

有什么想法吗!!

java performance permgen string-interning

2
推荐指数
1
解决办法
2439
查看次数

性能 - str_01 == str_02 vs(对象)str_01 ==(对象)str_02

在下面的代码示例中是否有任何性能优化,我比较两个字符串?

第一:

public static bool Compare_01()
{
    string str_01 = "a";
    string str_02 = "a";

    if (str_01 == str_02)
        return true;
    else
        return false;
}
Run Code Online (Sandbox Code Playgroud)

二:

public static bool Compare_02()
{
    string str_01 = "a";
    string str_02 = "a";

    if ((object)str_01 == (object)str_02)
        return true;
    else
        return false;
}
Run Code Online (Sandbox Code Playgroud)

他们两个都回来了true.

他们的il代码只有一个不同:

第一名:

IL_0001:  ldstr       "a"
IL_0006:  stloc.0     // str_01
IL_0007:  ldstr       "a"
IL_000C:  stloc.1     // str_02
IL_000D:  ldloc.0     // str_01
IL_000E:  ldloc.1     // str_02
IL_000F:  call …
Run Code Online (Sandbox Code Playgroud)

c# string performance string-interning

2
推荐指数
1
解决办法
88
查看次数