c++ - Julia 表演建议

标签 c++ performance julia

为了比较 Julia 与 C/C++ 的性能,我编写了一个非常简单的程序。基本上它返回小于给定数字的总素数。问题是我得到的平均时间比等效的 c/c++ 差 2.5 倍(据我所知,它应该接近 1.0 倍)。我正在使用 Julia 0.5.0(但是,我也在 0.6.0 上进行了测试,得到了相同的结果)。我发现将 % 更改为 mod 以执行模数运算会有所帮助。此外,在任何地方设置类型都给我带来了一些收获。

有人能帮我弄清楚我还缺少什么来提高 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

编辑 - 正如 Ron 提到的,这是我用来进行比较的 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.

最佳答案

这里有一些代码比你的快 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++ 编译器)。在 Test_isprime 中有一个小的修正,用于正确计数(结果是一样的,但是你在代码)。

编辑:如果您想要公平比较C++ 它也应该移到那里。

关于c++ - Julia 表演建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48967799/

相关文章:

java - 在 C++ 中怎么说 != 0-9

mysql - 极慢的MySQL性能

dataframe - 将多个函数应用于 Julia DataFrames.jl 中的单个列

c - 对 switch 语句使用不同的语法时,优化是否有任何可能的变化?

Python 3.5 与 3.6 相比,是什么让 "map"比理解更慢

csv - 具有不同列数的 Readtable() - Julia

使用 Julia 进行数据库抽象

c++ - 什么是 `CString` ?

c++ - 给定一个 x264 流和一个 ogg vorbis 流,我如何制作一个 mplayer/VLC 可以读取的混合流?

c++ - 在 WM_LBUTTONDOWN 消息中获取鼠标坐标