Performance 计算效率问题

Performance 计算效率问题,performance,Performance,我想知道计算效率。在本例中,我将使用Java,但这是一个一般的计算问题。假设我有一个字符串,我想得到字符串的第一个字母的值,作为一个字符串。所以我能做到 String firstletter = String.valueOf(somestring.toCharArray()[0]); 或者我可以: char[] stringaschar = somestring.toCharArray(); char firstchar = stringaschar[0]; String firstlette

我想知道计算效率。在本例中,我将使用Java,但这是一个一般的计算问题。假设我有一个字符串,我想得到字符串的第一个字母的值,作为一个字符串。所以我能做到

String firstletter = String.valueOf(somestring.toCharArray()[0]);
或者我可以:

char[] stringaschar = somestring.toCharArray();
char firstchar = stringaschar[0];
String firstletter = String.valueOf(firstchar);
我的问题是,这两种方法在计算上基本相同吗?我的意思是,第二种方法是显式地创建两个中间变量,临时存储在内存(堆栈?)中。
但是第一种方法也是,计算机仍然必须隐式地创建相同的变量,对吗?而且操作的数量没有改变。我的想法是,这两种方式是一样的。但我想确定一下。

在大多数情况下,这两种方法应该产生相同或几乎相同的目标代码。优化编译器通常会检测到第二个选项中的中间变量不是获得正确结果所必需的,并且会相应地折叠调用图。

这一切都取决于Java解释器决定如何将代码翻译成中间语言以供运行时执行。它实际上可能有一些优化,将这两种方法转换为完全相同的字节码。

这两种方法本质上应该是相同的。在这两种情况下,都会进行相同的调用,将字符串转换为数组,查找第一个字符并获取字符的值。编译器处理这些问题的方式可能会有一些细微的差别,但它们应该无关紧要。

前面的答案是一致的,没错

然而,我认为,每当您对任何计算资产(例如代码)的效率感到疑惑时,您都应该注意一些额外的和一般性的注意事项

首先,如果一切都在您的严格控制之下,原则上您可以从汇编代码中逐个计算时钟周期。或者从一些更抽象的推理中找出操作/算法的计算成本

到目前为止还不错。但别忘了事后测量。您可能会发现,测量执行时间并不是那么简单和直接,有时甚至是难以捉摸的(如何解释中断、I/O等待、网络瓶颈……)。但这是值得的。您可以在这里寻求建议,但您的编译器/解释器/P代码生成器/任何东西都可以在配置脚本的第三层中设置该开关

另一个需要考虑的问题是,黑箱的存在。在这个世界上,你并不孤单,黑匣子是用来运行你的代码的任何部分,这基本上是你无法控制的。编译器、操作系统、网络、存储系统以及整个世界都属于这一类

我们对黑匣子(它们是黑色的,要么是因为它们的代码不公开,要么是因为我们碰巧利用空闲时间钓鱼而不是挖掘库源代码)所做的是建立心智模型来帮助我们理解它们是如何工作的。(顺便说一句,这是一本关于我们人类如何打造我们的心智模型的非同寻常的书)。但你应该始终注意,它们是模型,而不是真实的东西。模型帮助我们解释事物。。。在某种程度上。在相对论和量子力学兴起之前,经典力学一直占据统治地位。它们都没有错——它们有局限性,我们所有的模型也是如此

即使您碰巧是路由器操作系统或Linux内核的朋友,在遇到效率问题时,也要设计一个好的实验并进行测量

注:设计一个好的实验,我的意思是当心沥青坑。示例:测量测量代码而不是实验目标,受外部因素影响,忘记将影响生产代码的外部因素,使用基数、正交性或与“真实世界”不同的任何性质的数据进行测试,错误地映射生产和测试客户机/服务器工作区et c、et c、et c


那就去测量你的密码。您的结果将是本页中最有趣的内容

我不记得是否有Java工具来检查编译的字节码——我知道它存在于C#中。当然,如果这是一个实际问题,那就是
String.charAt(int)
的用途。