计算效率问题

5 performance

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

String firstletter = String.valueOf(somestring.toCharArray()[0]);
Run Code Online (Sandbox Code Playgroud)

或者我可以这样做:

char[] stringaschar = somestring.toCharArray();
char firstchar = stringaschar[0];
String firstletter = String.valueOf(firstchar);
Run Code Online (Sandbox Code Playgroud)

我的问题是,这两种方式在计算上基本相同吗?我的意思是,第二种方式我明确地必须创建2个中间变量,暂时存储在内存(堆栈?)中.但第一种方式,计算机还必须隐式创建相同的变量,对吧?并且操作的数量不会改变.我的想法是,两种方式是一样的.但我想肯定地知道.

Dr.*_*ius 1

AFAIK,早期的答案是一致且正确的。

然而,我认为每次您想知道任何计算资产(例如代码)的效率时,您都应该注意一些额外的和一般性的考虑因素。

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

到目前为止,一切都很好。但不要忘记事后测量。您可能会发现测量执行时间并不那么容易和直接,有时甚至难以捉摸(如何考虑中断、I/O 等待、网络瓶颈......)。但它是值得的。您在这里寻求建议,但是您的编译器/解释器/P 代码生成器/任何内容都可以通过配置脚本第三层中的那个开关进行设置。

另一个考虑因素,更符合您当前的观点,是黑匣子的存在。您在世界上并不孤单,黑匣子是用于运行您的代码的任何部分,这基本上不受您的控制。编译器、操作系统、网络、存储系统和整个世界都属于这一类。

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

即使您碰巧对路由器操作系统或 Linux 内核很熟悉,当遇到效率问题时,请设计一个好的实验和措施

哈!

注意:通过设计一个好的实验,我的意思是要小心焦油坑。示例:测量您的测量代码而不是实验的目标,受到外部因素的影响,忘记会影响生产代码的外部因素,使用基数、正交性或其他性质与“现实世界”不同的数据进行测试,错误地映射了生产和测试客户端/服务器主力等。

所以去测量你的代码吧。您的结果将是此页面中最有趣的内容。