Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
朱莉娅绩效建议 我编写了一个非常简单的程序,以比较朱丽亚与C/C++的性能。基本上,它返回的总质数小于给定的数。问题是,我得到的平均时间比c/c++等价物差2.5倍(好吧,应该接近1.0x)。我使用的是Julia 0.5.0(但是,我也在0.6.0上进行了测试,得到了相同的结果)。我发现将%更改为mod来执行模运算有帮助。此外,到处设置类型也给了我一些好处_C++_Performance_Julia - Fatal编程技术网

朱莉娅绩效建议 我编写了一个非常简单的程序,以比较朱丽亚与C/C++的性能。基本上,它返回的总质数小于给定的数。问题是,我得到的平均时间比c/c++等价物差2.5倍(好吧,应该接近1.0x)。我使用的是Julia 0.5.0(但是,我也在0.6.0上进行了测试,得到了相同的结果)。我发现将%更改为mod来执行模运算有帮助。此外,到处设置类型也给了我一些好处

朱莉娅绩效建议 我编写了一个非常简单的程序,以比较朱丽亚与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

有人能帮我找出在这个例子中我还缺少什么来提高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
      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
类似的问题)。