我想知道计算效率。我将在本例中使用Java,但这是一个通用的计算问题。让我说我有一个字符串,我想得到字符串的第一个字母的值,作为一个字符串。所以我可以做到
String firstletter = String.valueOf(somestring.toCharArray()[0]);
或者我能做到:
char[] stringaschar = somestring.toCharArray();
char firstchar = stringaschar[0];
String firstletter = String.valueOf(firstchar);
我的问题是,两种方式在计算上基本相同吗?我的意思是,第二种方式我明确地必须创建2个中间变量,暂时存储在内存(堆栈?)中。 但第一种方式,计算机还必须隐式地创建相同的变量,对吧?并且操作的数量不会改变。我的想法是,两种方式是一样的。但我想肯定地知道。
答案 0 :(得分:4)
在大多数情况下,这两种方式应该产生相同或几乎相同的目标代码。优化编译器通常会检测到第二个选项中的中间变量不是获取正确结果所必需的,并会相应地折叠调用图。
答案 1 :(得分:2)
这完全取决于Java解释器如何决定将代码转换为运行时执行的中间语言。它实际上可能有优化,将两种方法转换为完全相同的字节代码。
答案 2 :(得分:2)
两者应该基本相同。在这两种情况下,您都会进行相同的调用,将字符串转换为数组,查找第一个字符,并获取字符的值。
表示编译器处理这些问题的方式可能存在细微差别,但它们应该是无关紧要的。答案 3 :(得分:1)
早期的答案是巧合而正确的,AFAIK。
然而,我认为每当您想知道任何计算资产(例如代码)的效率时,您应该注意一些额外的和一般的注意事项。
首先,如果一切都在您的严格控制之下,您原则上可以从汇编代码中逐个计算时钟周期。或者从一些更抽象的推理中找到一个操作/算法的计算成本。
到目前为止一切顺利。但是之后不要忘记衡量。您可能会发现测量执行时间并不容易和直接,有时难以捉摸(如何考虑中断,I / O等待,网络瓶颈......)。但它付出了代价。你在这里要求咨询,但是你的编译器/口译员/ P代码生成器/可以通过配置脚本的第三层中的THAT开关来设置。
另一个考虑因素,更接近你目前的观点是黑匣子的存在。你并不孤单,黑盒子是用于运行代码的任何部分,这基本上是你无法控制的。编译器,操作系统,网络,存储系统和世界通常都属于这一类。
我们使用Black Boxes(它们是黑色的,或者因为它们的代码不公开,或者因为我们恰好使用我们的空闲时间钓鱼而不是挖掘库源代码)正在建立心理模型以帮助我们理解它们是如何工作的。 (顺便说一句,This是一本非凡的书,讲述了我们人类如何锻造我们的心理模型)。但是你应该始终注意它们是模型,而不是真实的东西。模型帮助我们在一定程度上解释事物。经典力学统治直到相对论和量子力学为止。没有一个是错的他们有限制,我们所有的模型都是如此。
即使你恰好是路由器操作系统或Linux内核的朋友,在面对效率问题时,设计一个好的实验并测量。
HTH!
注意:通过设计一个好的实验我的意思是要注意焦油坑。示例:测量您的测量代码而不是实验目标,受外部因素影响,忘记影响生产代码的外部因素,测试其基数,正交性或任何理由与“现实世界”不同的数据,错误地映射生产和测试客户/服务器工作,等等,等等。
所以去吧,并保证你的代码。您的结果将是此页面中最有趣的内容。