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