我听过很多次了.向后计数时JavaScript循环真的更快吗?如果是这样,为什么?我已经看到一些测试套件示例显示反向循环更快,但我找不到任何解释为什么!
我假设它是因为循环不再需要在每次检查它是否完成时评估属性并且它只是检查最终的数值.
即
for (var i = count - 1; i >= 0; i--)
{
// count is only evaluated once and then the comparison is always on 0.
}
Run Code Online (Sandbox Code Playgroud) 我不知道这个问题是否在其他语言中有效,但我是专门问这个问题的JavaScript.
我在一些文章和问题中看到,JavaScript中最快的循环是这样的:
for(var i = array.length; i--; )
Run Code Online (Sandbox Code Playgroud)
同样在Sublime Text 2中,当您尝试编写循环时,它建议:
for (var i = Things.length - 1; i >= 0; i--) {
Things[i]
};
Run Code Online (Sandbox Code Playgroud)
我想知道,为什么i--比i++循环更快?
在C语言中,为什么n++执行速度比n=n+1?
(int n=...; n++;)
(int n=...; n=n+1;)
Run Code Online (Sandbox Code Playgroud)
我们的老师在今天的班上问了这个问题.(这不是作业)
可能重复:
倒计时比计数更快?
哪个循环有更好的性能?我从一些地方学到了第二个更好的地方.但想知道原因.
for(int i=0;i<=10;i++)
{
/*This is better ?*/
}
for(int i=10;i>=0;i--)
{
/*This is better ?*/
}
Run Code Online (Sandbox Code Playgroud) 一个) for(int i = 100000; i > 0; i--) {}
b) for(int i = 1; i < 100001; i++) {}
答案就在这个网站上(问题3).我只是想不通为什么?来自网站:
3. a
是
if(!test)
Run Code Online (Sandbox Code Playgroud)
比...快
if(test==-1)
Run Code Online (Sandbox Code Playgroud)
我可以生产组装,但是生产了太多的组件,我无法找到我追求的细节.我希望有人知道答案.我猜它们是相同的,除非大多数CPU架构都有某种"比较为零"的捷径.
谢谢你的帮助.
我正在研究.Net Native编译器执行的优化技术.我创建了一个示例循环:
for (int i = 0; i < 100; i++)
{
Function();
}
Run Code Online (Sandbox Code Playgroud)
我用Native编译了它.然后我.dll用IDA里面的机器代码反汇编了结果文件.结果,我有:
(我删除了一些不必要的行,所以不要担心地址行不一致)
我明白这add esi, 0FFFFFFFFh意味着subtract one from esi and alter Zero Flag if needed,所以如果还没有达到零,我们可以跳到开头.
我不明白的是为什么编译器重新循环?
我得出结论
LOOP:
add esi, 0FFFFFFFFh
jnz LOOP
Run Code Online (Sandbox Code Playgroud)
比例如更快
LOOP:
inc esi
cmp esi, 064h
jl LOOP
Run Code Online (Sandbox Code Playgroud)
但是真的是因为这个并且速度差异真的很重要吗?
我有一个SparseArray<myObject>并希望将它存储onSaveInstanceState在我的活动中的方法包中并将其恢复oncreate.我找到putSparseParcelableArray了将SparseArray放入bundle中的onSaveInstanceState方法,并在方法中执行了此操作:
bundle.putSparseParcelableArray("mySparseArray", mySparseArray);
Run Code Online (Sandbox Code Playgroud)
但是eclips显示了这个错误:
The method putSparseParcelableArray(String, SparseArray<? extends Parcelable>) in the type Bundle is not applicable for the arguments (String, SparseArray<myObject>)
Run Code Online (Sandbox Code Playgroud)
快速解决方法是将参数转换mySparsArray为SparseArray<? extends Parcelable>,但如果我这样做并在onCreate方法中获取它:
mySparseArray = (SparseArray<myObject>) savedInstanceState.getSparseParcelableArray("mySparseArray");
Run Code Online (Sandbox Code Playgroud)
它收到此错误:
Cannot cast from SparseArray<Parcelable> to SparseArray<myObject>
Run Code Online (Sandbox Code Playgroud)
如果这种方式出错了,将mySparseArray放入bundle中的解决方案是什么?任何帮助将非常感激.
可能重复:
倒计时比计数更快?
我正在为You ++阅读一本名为C++的C++书.(我有1998年版.)
在关于蒙特卡罗方法的章节中,有一段用于计算定积分的代码:
for(n = nPoints; n > 0; n--) { // A loop that goes down to
x = a + double(rand()) * ((b-a) / RAND_MAX); // 0 is slightly more efficient.
y = ...
... // if (y <= f(x)) increment count
...
}
Run Code Online (Sandbox Code Playgroud)
我的问题不是关于代码,而是关于评论:
降低到0的循环稍微有效.
这是真的?????
为什么循环降至零比升序循环更有效?
n,循环计数器,甚至没有在循环中使用!
同样,这不是一个迫切的问题.我只是好奇.我可能偶然发现了一种让我的程序更高效的方法!
可能重复:
倒计时比计数更快?
例如,
for (int i = 0; i < max; i++)
{
...
}
Run Code Online (Sandbox Code Playgroud)
和
for (int i = max-1; i >= 0; i--)
{
...
}
Run Code Online (Sandbox Code Playgroud)
这两个循环基本相同,并假设循环不包含任何数组操作.但是,对于第一种情况,每次迭代都需要将max加载到处理器中的寄存器中,然后在i和max之间进行比较..另一方面,后一种情况不需要将0加载到寄存器中,因为0已经是在寄存器中,所以只有后一个循环的比较.如果我错了,请纠正我,如果我是对的,请详细说明.谢谢.
performance ×5
optimization ×4
c++ ×3
loops ×3
c ×2
javascript ×2
.net-native ×1
algorithm ×1
android ×1
assembly ×1
bundle ×1
c# ×1
compare ×1
for-loop ×1
java ×1
processor ×1
sparse-array ×1
while-loop ×1
x86 ×1
zero ×1