Performance 我的逻辑怎么了?

Performance 我的逻辑怎么了?,performance,logic,Performance,Logic,在java中,他们说不要连接字符串,而是应该创建一个stringbuffer并不断添加到其中,然后在完成所有操作后,使用toString从中获取一个String对象。 这是我不明白的。他们说这样做是出于性能原因,因为串接字符串会产生很多临时对象。但是如果目标是性能,那么您应该使用像C/C++或汇编这样的语言 使用java的理由是,购买速度更快的处理器要比花钱让高级程序员编写快速高效的代码便宜得多。 所以一方面,你应该让硬件来解决效率低下的问题,但另一方面,你应该使用stringbuffers来提

在java中,他们说不要连接字符串,而是应该创建一个stringbuffer并不断添加到其中,然后在完成所有操作后,使用toString从中获取一个String对象。 这是我不明白的。他们说这样做是出于性能原因,因为串接字符串会产生很多临时对象。但是如果目标是性能,那么您应该使用像C/C++或汇编这样的语言

使用java的理由是,购买速度更快的处理器要比花钱让高级程序员编写快速高效的代码便宜得多。 所以一方面,你应该让硬件来解决效率低下的问题,但另一方面,你应该使用stringbuffers来提高java的效率


虽然我认为可以同时使用java和stringbuffers,但我的问题是,逻辑上的缺陷在哪里?要么使用更快的芯片,要么花更多的时间编写更高效的软件。

您应该始终尽可能地进行优化。你不应该仅仅因为你有一个快速的处理器就懒散地编码

我真的不知道stringbuffer是如何工作的,我也不知道Java是如何工作的,但是假设Java将字符串定义为char[],那么在执行str1+str2+str3+str4+str5时,您将分配大量的伪字符串,您只需要创建一个长度为str1.length+…str5.length的字符串,然后复制所有内容一次


然而,智能编译器会优化并自动使用stringbuffer,您应该始终尽可能地进行优化。你不应该仅仅因为你有一个快速的处理器就懒散地编码

我真的不知道stringbuffer是如何工作的,我也不知道Java是如何工作的,但是假设Java将字符串定义为char[],那么在执行str1+str2+str3+str4+str5时,您将分配大量的伪字符串,您只需要创建一个长度为str1.length+…str5.length的字符串,然后复制所有内容一次


然而,智能编译器会优化并自动使用stringbuffer。您应该使用stringbuffer而不是串联的论点是一个古老的java货物崇拜神话。Java编译器本身会将一系列串联转换为单个StringBuffer调用,这使得源代码中完全不需要这种优化


话虽如此,即使您使用的是缓慢的字节码或解释语言,也有合理的理由进行优化。您不想处理C/C++的bug、不稳定性和较长的开发周期,所以您使用的是一种功能更丰富的语言。内置弦,哇!但同时,您希望您的代码在使用该语言时尽可能快地运行,因此可以避免明显低效的构造。仅仅因为您使用java放弃了一些速度,并不意味着您应该完全忘记性能。

您应该使用StringBuffer而不是串联的论点是一个古老的java货物崇拜神话。Java编译器本身会将一系列串联转换为单个StringBuffer调用,这使得源代码中完全不需要这种优化

话虽如此,即使您使用的是缓慢的字节码或解释语言,也有合理的理由进行优化。您不想处理C/C++的bug、不稳定性和较长的开发周期,所以您使用的是一种功能更丰富的语言。内置弦,哇!但同时,您希望您的代码在使用该语言时尽可能快地运行,因此可以避免明显低效的构造。仅仅因为您使用java放弃了一些速度,并不意味着您应该完全忘记性能。

开发人员应该了解他们的编码选择对性能的影响

编写一个导致非线性性能(多项式、指数或更糟)的算法并不十分困难。如果您在某种程度上不了解语言、编译器和库是如何支持您的算法的,那么您可能会陷入任何处理能力都无法摆脱的陷阱。运行时或内存使用率呈指数级的算法可以很快超过任何硬件在合理时间内执行的能力

假设硬件可以扩展到设计糟糕的算法/编码选择是一个坏主意。以一个循环为例,它将100000个小字符串连接在一起,形成一条XML消息。这种情况并不少见,但当使用单个字符串连接而不是StringBuffer实现时,这将导致垃圾收集器必须处理的99999个大小不断增加的中间字符串。如果没有足够的内存,这很容易使操作失败——或者充其量只需要花很长时间才能运行

在上面的示例中,一些Java编译器通常可以(但并非总是)重写代码以在幕后使用StringBuffer,但这是例外,而不是规则。在许多情况下,编译器根本无法推断意图 开发人员的职责是编写高效的代码

最后一条评论——编写高效的代码并不意味着要花费所有的时间寻找微优化。过早优化是编写好代码的敌人。但是,您不应该将过早优化与理解算法在时间/存储方面的性能以及在哪种情况下使用哪种算法或设计的正确选择相混淆

作为一名开发人员,你不能忽视这一层次的知识,而只是假设你总是可以投入更多的硬件

开发人员应该了解他们的编码选择对性能的影响

编写一个导致非线性性能(多项式、指数或更糟)的算法并不十分困难。如果您在某种程度上不了解语言、编译器和库是如何支持您的算法的,那么您可能会陷入任何处理能力都无法摆脱的陷阱。运行时或内存使用率呈指数级的算法可以很快超过任何硬件在合理时间内执行的能力

假设硬件可以扩展到设计糟糕的算法/编码选择是一个坏主意。以一个循环为例,它将100000个小字符串连接在一起,形成一条XML消息。这种情况并不少见,但当使用单个字符串连接而不是StringBuffer实现时,这将导致垃圾收集器必须处理的99999个大小不断增加的中间字符串。如果没有足够的内存,这很容易使操作失败——或者充其量只需要花很长时间才能运行

在上面的示例中,一些Java编译器通常可以(但并非总是)重写代码以在幕后使用StringBuffer,但这是例外,而不是规则。在许多情况下,编译器根本无法推断开发人员的意图——编写高效代码成为开发人员的责任

最后一条评论——编写高效的代码并不意味着要花费所有的时间寻找微优化。过早优化是编写好代码的敌人。但是,您不应该将过早优化与理解算法在时间/存储方面的性能以及在哪种情况下使用哪种算法或设计的正确选择相混淆


作为一名开发人员,你不能忽视这一层次的知识,而只是假设你总是可以投入更多的硬件

不同之处在于,使用StringBuffer并不比串联字符串更难或更耗时。一般原则是,如果可以在不增加开发时间/难度的情况下获得效率,那么应该这样做:您的原则仅在不可能的情况下适用。

不同之处在于,使用StringBuffer并不比串联字符串更难或更耗时。一般原则是,如果可以在不增加开发时间/难度的情况下获得效率,那么应该这样做:您的原则仅在不可能的情况下适用。

Java!=无效代码


您不会为了避免编写高效代码而购买更快的处理器。一个差劲的程序员无论使用哪种语言都会写出差劲的代码。认为C/C++比Java更高效的论点是一个不再重要的老论点。

Java!=无效代码


您不会为了避免编写高效代码而购买更快的处理器。一个差劲的程序员无论使用哪种语言都会写出差劲的代码。认为C/C++比Java更高效的论点是一个已经不再重要的老论点。

语言的速度慢不是使用速度慢得多的算法的借口,Java现在也没有那么慢了

如果我们将一个1个字符连接到一个n个字符的字符串,我们需要将n+1个字符复制到新字符串中。如果我们这样做

string s;
for (int i = 0; i < N; ++ i)
  s = s + "c";
那么运行时间将为ON 2

相比之下,字符串缓冲区维护可变缓冲区,从而将运行时间缩短到ON

您不能将CPU加倍以将二次算法简化为线性算法


尽管优化器可能已经隐式地为您创建了一个StringBuffer。

语言的速度慢并不是使用速度慢得多的算法的借口,Java现在也没有那么慢

如果我们将一个1个字符连接到一个n个字符的字符串,我们需要将n+1个字符复制到新字符串中。如果我们这样做

string s;
for (int i = 0; i < N; ++ i)
  s = s + "c";
那么运行时间将为ON 2

相比之下,字符串缓冲区维护可变缓冲区,从而将运行时间缩短到ON

您不能将CPU加倍以将二次算法简化为线性算法


尽管优化器可能已经隐式地为您创建了StringBuffer。

在现实世界中,编程语言、操作系统和开发工具并不是由实际处理它的人选择的

某个推销员 A公司与你的老板共进午餐,推销其操作系统。。。然后另一个销售员邀请你的老板去脱衣舞女店销售它的数据库引擎。。。等等

然后,也只有到那时,他们才雇佣一群程序员来把所有这些整合起来。他们想要好的、快的和便宜的

这就是为什么你最终可能会在移动设备上用Java编写高性能应用程序,或者在Windows上用Python编写漂亮的3D图形


所以,你是对的,但没关系

在现实世界中,编程语言、操作系统和开发工具不是由实际处理它的人选择的

A公司的某位销售员与你的老板共进午餐,推销其操作系统。。。然后另一个销售员邀请你的老板去脱衣舞女店销售它的数据库引擎。。。等等

然后,也只有到那时,他们才雇佣一群程序员来把所有这些整合起来。他们想要好的、快的和便宜的

这就是为什么你最终可能会在移动设备上用Java编写高性能应用程序,或者在Windows上用Python编写漂亮的3D图形


所以,你是对的,但没关系

1连接字符串有几种方法。取决于字符串的数量,这是有意义的。2个字符串在java,python中是不可变的,但是它们在C++,C++中是可变的。所以,C/C++在As中咬你。java不经常这样做。因此,这是一个速度、成本和灵活性的问题。在现实生活中有很多因素需要考虑。1,有几种连接字符串的方法。取决于字符串的数量,这是有意义的。2个字符串在java,python中是不可变的,但是它们在C++,C++中是可变的。所以,C/C++在As中咬你。java不经常这样做。因此,这是一个速度、成本和灵活性的问题。现实生活中有很多因素需要考虑,C/C++比java更有效的说法是一个不再重要的古老论点。你真的需要对那句话加以限定。C/C++的效率在许多领域都很重要。在您认为可以购买更快的CPU而不是编写更高效的代码的环境中,这并不重要。也就是说,大多数业务应用程序不会注意到Java的任何性能问题。C/C++比Java更高效的说法已经不再重要了。你真的需要对那句话加以限定。C/C++的效率在许多领域都很重要。在您认为可以购买更快的CPU而不是编写更高效的代码的环境中,这并不重要。也就是说,大多数业务应用程序不会注意到Java的任何性能问题。真的吗?编译器将字符串转换为StringBuffer调用所需的引用或链接,因为我从未听说或阅读过它。真的吗?编译器将字符串转换为StringBuffer调用所需的引用或链接,因为我从未听说过或读过。啊,现实主义,你怎么敢在这样一个抽象的讨论中提出这一点!?:-啊啊。。。正当很高兴看到这些讨论是多么永恒。几年前,我们在C和C++之间进行了同样的争论,现在他们都在C/C++包中共同努力,在开发者心中争得一席之地。时光飞逝!啊,现实主义,你怎么敢在这么抽象的讨论中提出这个问题!?:-啊啊。。。正当很高兴看到这些讨论是多么永恒。几年前,我们在C和C++之间进行了同样的争论,现在他们都在C/C++包中共同努力,在开发者心中争得一席之地。时光飞逝!