C++的速度比Java快2.1%:来自计算100万以内质数的实验数据对比

为了验证C++到底比Java快多少分别用两种语言计算100万以内的质数,并记录时间

C++的程序是

clock_t start,ends;

start=clock();


 int i, j;

    for(i=2;i<1000000; i++) {

        for(j=2;j <= (i/j); j++) {

            if(!(i%j)){

                break;

            }

        }

        if(j> (i/j)) {

         //  cout << i << " 是质数\n";

        } 

    }


ends=clock();

cout<<(ends-start)*1000/CLOCKS_PER_SEC<<endl;

 

Java的程序是

   long sysDate1 =System.currentTimeMillis();

      int i, j;

       for(i=2;i<1000000;i++) {

          for(j=2;j<= (i/j);j++) {

              if((i%j==0))

              {

                   break;  

              }

          }

          if(j >(i/j)) {

            //  System.out.println(i+"是质数\\n");

          }

       }

      

       long sysDate2 =System.currentTimeMillis();

     System.out.println(sysDate2-sysDate1 );

这两个程序的结构基本是相同的不存在程序设计本身快慢的问题,每个程序运行60次,得到4组数据



c++(不显示中间过程ms) 显示过程ms java(不显示中间过程ms) 显示过程ms
967 58228 844 1624
738 57315 549 1716
736 56691 929 1833
784 57116 862 1884
768 56679 866 1801
888 81498 922 1801
713 79003 860 1792
881 79574 833 1891
962 79737 851 1806
875 78760 916 1894
729 78189 786 1807
846 82891 735 1777
860 79148 785 1745
870 76569 878 1737
788 79128 754 1770
779 72847 828 1895
731 74039 852 1766
656 72004 919 1863
835 76723 858 1979
839 77570 857 1882
840 70929 924 1747
833 73277 952 1861
900 73976 659 1765
747 73794 783 1830
795 73472 813 1764
849 70584 769 1784
832 72319 834 1740
809 71475 892 1810
834 72823 818 1808
766 71847 834 1684
平均
815 72606.83333 832.0666667 1801.866667
标准差
70.69370552 7616.064198 82.16809329 71.20521204
* * 0.020940695 40.29534187


可以看到在不显示中间过程

//   cout << i << " 是质数\n";

//  System.out.println(i+"是质数\\n");

的情况下C++30次平均用时815ms,Java用时832ms,C++比Java快2.1%。

但是如果将中间运算过程打印到控制台并显示

 cout << i << " 是质数\n";

System.out.println(i+"是质数\\n");

C++平均用时72606ms,Java用时1801ms,Java的控制台显示速度是C++的40倍。

所以运算量很大希望看看中间的运算过程看看是没算完还是死机了,显示样本的比例就非常重要,2%的速度优势很容易就被40倍的控制台显示速度给消耗掉了。

比如这道题很容易用方程算出

815+71791*x/78498=832+969*x/78498

X=18,也就是说每4361(78498/18)个显示1个的比例C++才可能比Java快

只要x>18个Java的速度就比C++快。

很容易得到方程Java/C++的速度比,x是显示的样本数量

 

(63975870+71791*x)/(65310336+969*x)=y


C++的速度比Java快2.1%:来自计算100万以内质数的实验数据对比


当样本数量x<=18时C++>Java

C++的速度比Java快2.1%:来自计算100万以内质数的实验数据对比



当样本数量x>=18时C++<Java

所以对这道题当不显示中间过程的情况下C++比Java快2.1%,如果需要显示过程当抽样总数量超过18个的时候Java比C++快,如果需要显示所有的中间过程Java比C++快40倍.