通常认为StringBuilder在Java中使用字符串连接通常是优选的.总是这样吗?
我的意思是:创建一个StringBuilder对象的开销,调用append()方法,最后toString()已经小了,然后将现有的字符串与+运算符连接两个字符串,或者只建议更多(超过两个)字符串?
如果有这样的阈值,它依赖于什么(可能是字符串长度,但以哪种方式)?
最后,您是否会交换+串联的可读性和简洁性,以便StringBuilder在较小的情况下(如两个,三个或四个字符串)的性能?
StringBuilder在过时的Java优化技巧以及Java都市神话中,人们提到明确使用常规连接已经过时了.
引自http://sites.google.com/site/gson/gson-design-document:
为什么Gson中的大多数课程都被标记为最终?
虽然Gson通过提供可插拔序列化器和反序列化器提供了相当可扩展的架构,但Gson类并未专门设计为可扩展.提供非最终类将允许用户合法地扩展Gson类,然后期望该行为在所有后续修订中工作.我们选择通过将类标记为final来限制这样的用例,并等到出现良好的用例以允许扩展性.标记类final也有一个很小的好处,即为Java编译器和虚拟机提供额外的优化机会.
为什么会这样?[如果我猜测:JVM知道类是最终的,它不维护方法覆盖表?还有其他原因吗?]
性能有什么好处?
这是适用于频率实例化的类(POJO?)还是适用于持有静态方法(实用类)的类?
定义为final的方法在理论上也可以提高性能吗?
有什么影响吗?
谢谢你,马克西姆.
标题很好地反映了我的问题.我想知道有关JVM(不仅仅是HotSpot,但显然是开始的地方)如何实现或处理特定功能的问题是否有良好的资源或跳跃点?我不是在寻找JLS或JVM规范中的东西- 我知道先去那里.
例如:在尝试理解性能问题时,我们经常进行的对话不是关于规范的内容,而是实际实现中的当代最佳实践.例如,有一些城市神话说"最终类在Java中表现更好,因为JVM可以内联或以其他方式优化这些东西." 是否有一般资源我们可以转向以评估这些浮动的声明?
我通过HotSpot特定的参考资料回答了我自己的问题.其他供应商的产品呢?小型JVM的细节?多核细节?平台细节,如果它们有所作为?其他JVM语言的细节?
只是为了避免一些潜在的抱怨:1)这不是寻找过早的优化(事实上,更好地理解平台应该劝阻受过良好教育的开发人员!); 2)我知道Java程序员应该专注于漂亮,可移植,随处运行的代码,但对于我们中的许多人而言,平台细节最终会引起关注!
这是通过对一些有用的意见启发的具体问题由托尔比约恩Ravn的安德森.我很高兴收集一些其他更有用的例子,超出我上面引用的例子,以激发人们可能想要这些资源的原因.
在SO一些有趣的相关问题:尾部调用优化的JVM,杀手JVM功能,优化,都将是无用的明天,JVM实现之间的差异.
编辑添加: 我将答案提供给所提及的最佳个人参考,或者提供指向网站的指针(可能是为了回答这个问题而建立的),最好地集中/编目JVM实施智慧和实际后果.客户语言和开发人员.
我有一个巨大的XML文件(15 GB).我想将XML文件中的"text"标记转换为单个页面.
示例XML文件:
<root>
<page>
<id> 1 </id>
<text>
.... 1000 to 50000 lines of text
</text>
</page>
... Like wise 2 Million `page` tags
</root>
Run Code Online (Sandbox Code Playgroud)
我最初使用DOM解析器,但它会抛出JAVA OUT OF MEMORY(有效).现在,我使用STAX编写了JAVA代码.它运作良好,但性能非常慢.
这是我写的代码:
XMLEventReader xMLEventReader = XMLInputFactory.newInstance().createXMLEventReader(new FileInputStream(filePath));
while(xMLEventReader.hasNext()){
xmlEvent = xMLEventReader.nextEvent();
switch(xmlEvent.getEventType()){
case XMLStreamConstants.START_ELEMENT:
if( element == "text")
isText = true;
break;
case XMLStreamConstants.CHARACTERS:
chars = (Characters) xmlEvent;
if(! (chars.isWhiteSpace() || chars.isIgnorableWhiteSpace()))
if(isText)
pageContent += chars.getData() + '\n';
break;
case XMLStreamConstants.END_ELEMENT:
String elementEnd = (((EndElement) xmlEvent).getName()).getLocalPart();
if( elementEnd == "text" ) …Run Code Online (Sandbox Code Playgroud) 我想知道声明多个不需要的变量以使我的代码更具可读性是否合适.以下哪个片段的编码更好?它计算两个质量之间的力.
// 1
double dx = xPos - b.xPos;
double dy = yPos - b.yPos;
double r = Math.sqrt(dx*dx + dy*dy);
double F = G * mass * b.mass / (r*r);
// 2
double Fx = G * mass * b.mass / Math.pow( Math.sqrt(Math.pow(2,xPos-b.xPos) + Math.pow(2,yPos-b.yPos)), 2);
Run Code Online (Sandbox Code Playgroud)
如何平衡可读性和性能?是否可以在一行中完成评论好吗?
(我意识到Math.pow(Math.sqrt(在第二个例子中可以删除,但这只是一个例子)