草庐IT

java - 对于长度变化很大的输入,最佳 StringBuffer 初始容量是多少?

coder 2024-03-27 原文

大家下午好,我正在使用 java.lang.StringBuilder存储一些字符。我不知道我要提前存储多少个字符,除了:

  1. 60% 的情况下,它只有(恰好)7 个字符
  2. 39% 的时间是(大约)3500 个字符
  3. 1% 的时间,大约是 20k 个字符

我们如何计算应该使用的最佳初始缓冲区长度?

目前我正在使用 new java.lang.StringBuilder(4000) 但那只是因为我以前懒得想。

最佳答案

这里有两个因素:时间和内存消耗。该时间主要受 java.lang.AbstractStringBuilder.expandCapacity() 调用次数的影响。当然,每次调用的成本与缓冲区的当前大小成线性关系,但我在这里进行了简化,只是计算它们:

expandCapacity() 的次数(时间)

默认配置(16个字符容量)

  • 在 60% 的情况下,StringBuilder 将展开 0 次
  • 在 39% 的情况下,StringBuilder 会扩展 8 倍
  • 在 1% 的情况下,StringBuilder 会扩展 11 倍

expandCapacity 的预期数量是 3,23。

初始容量4096个字符

  • 在 99% 的情况下,StringBuilder 将展开 0 次
  • 在 1% 的情况下,StringBuilder 会扩展 3 倍

expandCapacity 的预期数量是 0,03。

如您所见,第二种情况似乎要快得多,因为它很少需要扩展 StringBuilder(每 100 个输入三次)。但是请注意,第一次扩展不太重要(复制少量内存);此外,如果您以大块的形式向构建器添加字符串,它将在更少的迭代中更急切地扩展。

另一方面,内存消耗增长:

内存消耗

默认配置(16个字符容量)

  • 在 60% 的情况下,StringBuilder 将占用 16 个字符
  • 在 39% 的情况下,StringBuilder 将占用 4K 个字符
  • 在 1% 的情况下,StringBuilder 将占用 32K 个字符

预期的平均内存消耗为:1935 个字符。

初始容量4096个字符

  • 在 99% 的情况下,StringBuilder 将占用 4K 个字符
  • 在 1% 的情况下,StringBuilder 将占用 32K 个字符

预期的平均内存消耗为:4383 个字符。


长话短说

这让我相信,将初始缓冲区扩大到 4K 将使内存消耗增加两倍以上,同时将程序加速两个数量级

底线是:尝试!编写一个基准程序来处理具有不同初始容量的各种长度的数百万个字符串并不难。但我相信更大的缓冲区可能是一个不错的选择。

关于java - 对于长度变化很大的输入,最佳 StringBuffer 初始容量是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8953418/

有关java - 对于长度变化很大的输入,最佳 StringBuffer 初始容量是多少?的更多相关文章

  1. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  2. ruby-on-rails - unicode 字符串的长度 - 2

    在我的Rails(2.3,Ruby1.8.7)应用程序中,我需要将字符串截断到一定长度。该字符串是unicode,在控制台中运行测试时,例如'א'.length,我意识到返回了双倍长度。我想要一个与编码无关的长度,以便对unicode字符串或latin1编码字符串进行相同的截断。我已经了解了Ruby的大部分unicode资料,但仍然有些一头雾水。应该如何解决这个问题? 最佳答案 Rails有一个返回多字节字符的mb_chars方法。试试unicode_string.mb_chars.slice(0,50)

  3. ruby - 如何以所有可能的方式将字符串拆分为长度最多为 3 的连续子字符串? - 2

    我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123

  4. ruby-on-rails - 未初始化的常量 Psych::Syck (NameError) - 2

    在我的gem中,我需要yaml并且在我的本地计算机上运行良好。但是在将我的gem推送到ruby​​gems.org之后,当我尝试使用我的gem时,我收到一条错误消息=>"uninitializedconstantPsych::Syck(NameError)"谁能帮我解决这个问题?附言RubyVersion=>ruby1.9.2,GemVersion=>1.6.2,Bundlerversion=>1.0.15 最佳答案 经过几个小时的研究,我发现=>“YAML使用未维护的Syck库,而Psych使用现代的LibYAML”因此,为了解决

  5. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  6. ruby-on-rails - 未在 Ruby 中初始化的对象 - 2

    我在Rails工作并有以下类(class):classPlayer当我运行时bundleexecrailsconsole然后尝试:a=Player.new("me",5.0,"UCLA")我回来了:=>#我不知道为什么Player对象不会在这里初始化。关于可能导致此问题的操作/解释的任何建议?谢谢,马里奥格 最佳答案 havenoideawhythePlayerobjectwouldn'tbeinitializedhere它没有初始化很简单,因为你还没有初始化它!您已经覆盖了ActiveRecord::Base初始化方法,但您没有调

  7. java - 等价于 Java 中的 Ruby Hash - 2

    我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

  8. ruby - 匹配大写字母并用后续字母填充,直到一定的字符串长度 - 2

    我有一个驼峰式字符串,例如:JustAString。我想按照以下规则形成长度为4的字符串:抓取所有大写字母;如果超过4个大写字母,只保留前4个;如果少于4个大写字母,则将最后大写字母后的字母大写并添加字母,直到长度变为4。以下是可能发生的3种情况:ThisIsMyString将产生TIMS(大写字母);ThisIsOneVeryLongString将产生TIOV(前4个大写字母);MyString将生成MSTR(大写字母+tr大写)。我设法用这个片段解决了前两种情况:str.scan(/[A-Z]/).first(4).join但是,我不太确定如何最好地修改上面的代码片段以处理最后一种

  9. ruby-on-rails - ActionController::RoutingError: 未初始化常量 Api::V1::ApiController - 2

    我有用于控制用户任务的Rails5API项目,我有以下错误,但并非总是针对相同的Controller和路由。ActionController::RoutingError:uninitializedconstantApi::V1::ApiController我向您描述了一些我的项目,以更详细地解释错误。应用结构路线scopemodule:'api'donamespace:v1do#=>Loginroutesscopemodule:'login'domatch'login',to:'sessions#login',as:'login',via::postend#=>Teamroutessc

  10. ruby - 这两个 Ruby 类初始化定义有什么区别? - 2

    我正在阅读一本关于Ruby的书,作者在编写类初始化定义时使用的形式与他在本书前几节中使用的形式略有不同。它看起来像这样:classTicketattr_accessor:venue,:datedefinitialize(venue,date)self.venue=venueself.date=dateendend在本书的前几节中,它的定义如下:classTicketattr_accessor:venue,:datedefinitialize(venue,date)@venue=venue@date=dateendend在第一个示例中使用setter方法与在第二个示例中使用实例变量之间是

随机推荐