朱莉娅绩效建议 我编写了一个非常简单的程序,以比较朱丽亚与C/C++的性能。基本上,它返回的总质数小于给定的数。问题是,我得到的平均时间比c/c++等价物差2.5倍(好吧,应该接近1.0x)。我使用的是Julia 0.5.0(但是,我也在0.6.0上进行了测试,得到了相同的结果)。我发现将%更改为mod来执行模运算有帮助。此外,到处设置类型也给了我一些好处
有人能帮我找出在这个例子中我还缺少什么来提高Julia的表现吗?提前谢谢朱莉娅绩效建议 我编写了一个非常简单的程序,以比较朱丽亚与C/C++的性能。基本上,它返回的总质数小于给定的数。问题是,我得到的平均时间比c/c++等价物差2.5倍(好吧,应该接近1.0x)。我使用的是Julia 0.5.0(但是,我也在0.6.0上进行了测试,得到了相同的结果)。我发现将%更改为mod来执行模运算有帮助。此外,到处设置类型也给了我一些好处,c++,performance,julia,C++,Performance,Julia,有人能帮我找出在这个例子中我还缺少什么来提高Julia的表现吗?提前谢谢 module modIsPrime export isprime, Test_isprime @inline function isprime( nNumber :: Int64 ) :: Int64 s = Int( trunc( sqrt( nNumber ) ) ) if mod( nNumber, 2 ) == 0 return 0 el
module modIsPrime
export isprime, Test_isprime
@inline function isprime( nNumber :: Int64 ) :: Int64
s = Int( trunc( sqrt( nNumber ) ) )
if mod( nNumber, 2 ) == 0
return 0
else
for i = 3 : 2 : s
if mod( nNumber, i ) == 0
return 0
end
end
return 1
end
end
function Test_isprime( )
nPrimeNumbers :: Int64 = 0
n :: Int64 = 0
for n = 1 : 2 : 16000000
nPrimeNumbers += isprime( n )
end
display( [ "Prime numbers: " nPrimeNumbers ] )
end
end
<>编辑-正如罗恩所说,这里是我用来做比较的C++代码:
#include "stdafx.h"
#include <chrono>
#include <iostream>
#include <omp.h>
#include <math.h>
using namespace std;
using namespace chrono;
#define DEFAULT_MAX_TESTS 16'000'000
inline int isprime( unsigned long nNumber ) {
unsigned long
i
, s = static_cast< unsigned long >( sqrt( static_cast< double >( nNumber ) ) )
;
if ( nNumber % 2 == 0 ) {
return 0;
} else {
for( i = 3; i <= s; i += 2 ) {
if ( nNumber % i == 0 ) return 0;
} // for.
return 1;
} // else.
} // isprime.
int main( ) {
const unsigned long cstnMaxTests = DEFAULT_MAX_TESTS;
unsigned long nPrimeNumbers = 0;
steady_clock::time_point start = steady_clock::now( );
for( long n = 1; n < cstnMaxTests; n += 2 ) {
nPrimeNumbers += isprime( n );
} // for.
steady_clock::time_point end = steady_clock::now( );
auto time = duration_cast< milliseconds >( end - start ).count( );
cout
<< "milliseconds: " << time
<< endl << "Number of Primes: " << nPrimeNumbers
<< endl
;
return 0;
} // main.
#包括“stdafx.h”
#包括
#包括
#包括
#包括
使用名称空间std;
使用名称空间计时;
#定义默认\u最大\u测试16'000'000
内联整数iPrime(无符号长nNumber){
无符号长
我
,s=静态_cast(sqrt(静态_cast(nNumber)))
;
如果(n编号%2==0){
返回0;
}否则{
for(i=3;i(end-start).count();
库特
这里有一些代码比您的代码快4倍左右:
module modIsPrime
export isprime, Test_isprime
@inline function isprime(nNumber)
nNumber & 1 == 0 && return 0
for i = 3:2:isqrt(nNumber)
i*unsafe_trunc(Int,nNumber/i) == nNumber && return 0
end
return 1
end
function Test_isprime()
nPrimeNumbers = 1
for n = 3:2:16000000
nPrimeNumbers += isprime(n)
end
println("Prime numbers: ", nPrimeNumbers)
end
end
最好能看到同一台机器上的定时比较(我手头没有C++编译器)。在代码> > TestIOSISP< <代码>中有一个小的修正,用于正确的计数(结果是相同的,但是你在代码中计数为<代码> 1代码/代码>,代码< 2 < /code >为复合代码)。
<>强> >编辑>强>:在测试次数为偶数之后,我已经移动了<代码> ISQRT < /C> >,这节省了一些时间(不是一个主要的事情),如果你想要一个公平的C++比较,它也应该移动到那里。除非你直接与一个特定的C程序(你应该显示)或一个特定的C++程序进行比较。(您应该显示)这是一个特定于Julia的问题,应该只有该语言标签。根据我的经验,isqrt
非常慢。可能使用floor(Int,sqrt(nNumber))“是的?”——这是比较快的,但并不总是正确的。我已经使用了一个安全的选项,作为<代码> ISQRT 不是代码的性能关键部分。实际上C++代码似乎也存在精度问题(因此,对于性能测试,我们可以切换到您的方法)要知道为什么<代码> ISQRT 需要检查这两种方法,例如“代码< > 3 ^ 36-1 <代码> > @ Bogumi-KAMi-SKY,你是对的。公平地说,我把Sqt计算移到C++代码的等效点,但是结果几乎是一样的。我猜,C++已经为我做了这个优化。你的代码快了,现在我得到了1。我认为朱丽亚的固定类型似乎是毫无意义的。很惊讶地发现,<代码> i unSuffyTrunc(int,nTo/i)=nt/<代码>将比传统的<代码> mod < /代码>更快。非常感谢。“我很惊讶地意识到我不安全Tununc(int,nt/i)。==nNumber将比传统的mod快“mod
在现代处理器中只是一个缓慢的操作,应该尽可能避免。这不仅仅是Julia问题。此外,请注意,该解决方案仅适用于完全精确的Float64
中的整数(因此,我们在这里遇到了与在sqrt(nNumber)
上运行floor
类似的问题)。