假设我有两个同样长的数字数组。我想创建第三个数组:
c[0] = a[0] * b[0]
c[1] = a[1] * b[1]
...
如果我在Matlab中,我可以写一个执行乘法运算的循环:
for i=1:length(a)
c(i) = a(i) * b(i);
end
但是我知道避免for循环很好,而且有办法做到这一点,这是:
c = a .* b;
这对我来说很有意义,并且在两个长度为8192的随机数阵列上对它进行了多次计时,。*方法总是比for循环快3倍。
所以现在我想在Java中乘以数组。所以我写了一个for循环并说:
for (int i=0; i<a.length; i++) {
c[i] = a[i] * b[i];
}
我的问题是:有没有更好的方法来避免for循环?如果有,它会有所作为吗?在我看来,它在没有for循环的情况下运行得更快,因为它是并行而不是串联的数字相乘,但我不知道底层发生了什么(就像编译器自己展开循环一样)。
答案 0 :(得分:3)
.*
比Matlab中的显式循环更快(至少)有两个原因。通过 explicit 我的意思是用Matlab代码编写的循环,而不是Matlab函数可能正在使用的内部循环。原因是:
.*
是vectorized。这意味着,尽管很可能在内部使用循环进行计算,但该循环已在some faster language中编码,而不是Matlab本身。.*
是multithreaded,因此它可以从并行运行的多个内核中受益。所以在Matlab中,只要有内置的矢量化函数,就应该使用它。尽管近年来Matlab显式循环的速度有所提高(例如,由于JIT编译),但它们仍然比它们的矢量化版本慢。
Java遵循更传统的方法,其中显式循环是常态。它们并不慢,通常没有可以替换它们的矢量化函数。所以我想说一个显式循环是Java的发展方向。
答案 1 :(得分:2)
虽然你没有在Matlab中编写一个循环,但在下面,它最有可能存在某种循环,甚至可能不止一个(我们必须检查源代码)。 Matlab没有什么神奇之处。它只是一个简化的&#34;语言,其下面有更复杂的代码生成。
您的Java循环是正确的方法。