(对于那些熟悉JVM编译和优化技巧的人来说是一个问题… :-)
是否有任何一种“ for”和“ foreach”模式明显优于另一种?
考虑以下两个示例:
public void forLoop(String[] text)
{
if (text != null)
{
for (int i=0; i<text.length; i++)
{
// Do something with text[i]
}
}
}
public void foreachLoop(String[] text)
{
if (text != null)
{
for (String s : text)
{
// Do something with s, exactly as with text[i]
}
}
}
是forLoop
快或慢foreachLoop
?
假设在这两种情况下,text
阵列都不需要进行任何健全性检查,是否有明显的获胜者或仍然太接近而无法进行跟注?
编辑:正如在某些答案中指出的,数组的性能应该相同,而“ foreach”模式对于像列表这样的抽象数据类型可能会稍好一些。
另请参阅讨论主题的此答案。
从JLS的14.14.2节开始:
否则,表达式必须具有数组类型T []。令L1 …
Lm为紧接增强的for语句之前的标签(可能为空)序列。然后,增强的for语句的含义由以下基本for语句给出:T[] a = Expression; L1: L2: ... Lm: for (int i = 0; i < a.length; i++) { VariableModifiersopt Type Identifier = a[i]; Statement }
换句话说,我希望它们最终被编译为相同的代码。
绝对有一个明显的赢家:增强的for循环 更具可读性 。那应该是您的主要关注点-当您证明最易读的表格无法获得理想的效果时,甚至应该 _考虑_对这种事情进行微优化。
我试图在for循环中获得for循环,因此输出如下: 我希望输出显示一个正方形 我不知道它为什么不这样做。下面是我的代码:
问题内容: 我不确定这个问题是否与语言无关,因此我将以Java问题的身份提出。如果你有这样的循环 循环的每次迭代都在创建新的内存空间吗?如果是这样,是否要处理旧空间?如果没有,做这样的事情更有效吗 编辑:更新了代码以更好地说明问题 问题答案: 简短的答案:即使在Java中进行开发时,也不要理会这些事情,即使这些问题中的大多数都是由JVM自己处理的。 垃圾收集器将知道该怎么做,并将根据情况尝试做最好
主要内容:for、do-while 和 while 的区别for 语句是应用最广泛、功能最强的一种循环语句。大部分情况下,for 循环可以代替 while 循环、do while 循环。 for 语句是一种在程序执行前就要先判断条件表达式是否为真的循环语句。假如条件表达式的结果为假,那么它的循环语句根本不会执行。 for 语句通常使用在知道循环次数的循环中。 for 语句语法格式如下所示。 for 循环中 3 个条件表达式的含义如表 1 所示。 表 1
Apex中有一个传统的类似Java的for循环。 语法 (Syntax) for (init_stmt; exit_condition; increment_stmt) { code_block } 流程图 (Flow Diagram) 例子 (Example) 请考虑以下示例以了解传统for循环的用法 - // The same previous example using For Loop
问题内容: 我正在编写一个游戏引擎,其中使用for循环迭代保存在a 中的一组对象。显然,效率非常重要,因此我想知道循环的效率。 当返回的秒。我想知道的是,每次循环在新扩展上进行迭代时,是否都调用该方法。如果是这样,这样做会更有效: ?提前致谢。 问题答案: 按照规范,这个成语 扩展成 因此,您询问的呼叫在循环初始化时仅发生一次。这是迭代器对象,其方法被重复调用。 但是,如果您真的对应用程序的性能感
问题内容: 问候贵族社区, 我想要以下循环: 这将在使用线程的共享内存四核计算机上并行运行。对于这些线程要执行的代码,正在考虑以下两种选择,其中线程的ID是:0、1、2或3。 (为简单起见,假设为4的倍数) 选项1: 选项2: 我的问题是,是否有一种方法比另一种方法更有效,为什么? 问题答案: 第二个比第一个更好。简单的答案:第二个最小化错误共享 现代CPU不会将字节一一加载到缓存中。它在称为缓存