C++和java执行浮点计算的效率测试
来源:互联网 发布:java基础培训 编辑:程序博客网 时间:2024/06/10 23:50
之前学习的时候从来没有就C++和java的执行速度进行测试过,今天想就浮点数运算进行一下测试。
我的CPU主频2.6G, 就是1秒有2.6G和时钟周期,假设平均一条指令分为3个机器周期,一个机器周期平均有4个时钟周期,则1秒能执行2.6G/3/4 调指令。约为2亿多条指令。
测试1:首先测试一下计数器加1亿次需要的时间:
C++代码:
#include<iostream>#include <windows.h>using namespace std;const int N=100000000;int main(){ SYSTEMTIME sys; GetLocalTime( &sys ); long t=(long)sys.wHour*60*60000+sys.wMinute*60000+sys.wSecond*1000+sys.wMilliseconds; for(int i=0;i<N;i++); GetLocalTime( &sys ); long t2=(long)sys.wHour*60*60000+sys.wMinute*60000+sys.wSecond*1000+sys.wMilliseconds; cout<<t2-t<<"ms"; return 0;}java代码:
public class TimeTest0 {public static void main(String[] args) { final int N=100000000; long t=System.currentTimeMillis(); int i; for(i=0;i<N;i++);System.out.println("程序运行时间: "+(System.currentTimeMillis()-t)+"ms");System.out.println(i);}执行时间如下(单位ms):
1
2
3
4
5
6
7
8
9
10
平均
C++
31
31
16
32
16
16
15
22
31
15
22.5
java
0
5
15
16
16
0
16
16
0
16
10
这是编译器进行了优化,并没有执行循环,因为后面没有引用循环里面的东西
测试2:
再测试一下执行1亿次浮点乘和一亿次浮点除运算所需要的时间:
分别写C++和java代码如下:
C++代码:
#include<iostream>#include <windows.h>using namespace std;const int N=100000000;int main(){ double m=173.783; SYSTEMTIME sys; GetLocalTime( &sys ); long t=(long)sys.wHour*60*60000+sys.wMinute*60000+sys.wSecond*1000+sys.wMilliseconds; for(int i=0;i<N;i++) { m=(m*2.3)/2.3; } GetLocalTime( &sys ); long t2=(long)sys.wHour*60*60000+sys.wMinute*60000+sys.wSecond*1000+sys.wMilliseconds; cout<<t2-t<<"ms"; cout<<m<<endl; return 0;}
</pre><pre code_snippet_id="1666495" snippet_file_name="blog_20160429_3_192812" name="code" class="cpp">java 代码:
public class TimeTest1 {public static void main(String[] args) { final int N=100000000; double m=173.783; long t=System.currentTimeMillis();for(int i=0;i<N;i++){m=(m*2.3)/2.3;}System.out.println("程序运行时间: "+(System.currentTimeMillis()-t)+"ms");System.out.println(m);}}
注意:java代码一定要有System.out.println(m);不然编译优化并不会执行循环里面的m=(m*2.3)/2.3;(因为m在后面用不到了)
下面是执行十次用的时间:
1
2
3
4
5
6
7
8
9
10
平均
Java
839
839
834
924
835
832
818
834
833
818
840.6
C++
1102
1102
1105
1103
1103
1101
1119
1102
1102
1103
1104.2
大约用了1s,执行了1亿次乘法和1亿次除法,和之前的估算的差不多。
为什么java比c++快我也不知道,知道的人请不吝赐教。
测试3:
此次测试是为了测试oj的运行效率,发现没有我的机器的运行效率高。。。
poj上代码:
#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
int main(){
long long m=1234;
int a,b;
cin>>a>>b;
for(long long i=1;i<4000000;i++)
{
m=m*i%1000000007;
}
int ans=a+b;
if(m>=0)
cout<<ans<<endl;
return 0;
}
四次运行如下代码时间:
672
719
704
688
去除循环测试为0MS,所以4000,000次循环的时间为700ms左右,但是此次测试是在poj上测试的,之前测试是在本地机器上测试的,都用的是g++编译器,差别这么大应该是服务器主频和我的主频不一样。
本机代码:
#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
const int N = 1e8;
int main(){
long long m=1234;
for(long long i=1;i<N;i++)
{
m=m*i%1000000007;
}
cout<<m<<endl;
return 0;
}
运行时间在1.5s左右,运行1亿次浮点乘法和浮点取余运算。比oj性能好很多。
综上,oj上运行乘除法指令级别为百万级的,不用oj性能不知道会不会差不多。
测试4:
本次测试是为了测试加减法的效率和乘除法的效率。
#include<iostream>#include<cstdio>#include<vector>using namespace std;const int N = 1e8;int main(){ long long m=1234; for(long long i=1;i<N;i++) { m=m+m; m=m-m/2; } cout<<m<<endl; return 0;}平均运行时间为665ms,比乘法和取模运算快一倍。
- C++和java执行浮点计算的效率测试
- C++/JAVA/C#运行机制和执行效率
- C语言中调用lua 脚本执行的效率测试
- 浅谈C++/JAVA/C#运行机制和执行效率
- 浅谈C++/JAVA/C#运行机制和执行效率
- 浅谈C++/JAVA/C#运行机制和执行效率
- 浅谈C++/JAVA/C#运行机制和执行效率
- 程序员经常争论的话题:C++/JAVA/C#运行机制和执行效率
- java四舍五入浮点数的效率
- Java的JVM与c/c++的执行效率
- 正确认识java JVM与c的执行效率
- 正确认识java JVM与c的执行效率
- python中使用time模块计算代码执行效率的精度测试
- java final方法执行效率测试
- ruby: 如何测试ruby的执行效率?
- java中金额(浮点表示)的计算
- java中金额(浮点表示)的计算
- java中浮点数的计算
- Android中SurfaceView的使用详解
- lol 5.24版本top5:火男胜率登顶
- HDU2089不要62
- 破解wifi详细教程及笔记总结
- 《FPGA入门教程》看书随笔——数字电路设计入门
- C++和java执行浮点计算的效率测试
- 基于animate.css弹出框弹出关闭特效 (5星级)
- Android特效专辑(三)——自定义不一样的Toast
- 初识Ildasm.exe——IL反编译的实用工具
- 解决unicodedecodeerror ascii codec can’t decode byte 0xd7 in position 9 ordinal not in range(128)
- 混合、抗锯齿、雾、多边形偏移及显示列表(openGL)
- Android线程问题及主线程与子线程的交互
- 黑马程序员-OC语言-Foundation-NSArray
- OC中Super