测试环境:CPU :iM ;内存:G; JAVA IDE:elipse ;C IDE:VCCFree
问题一:到底是乘法效率高还是除法效率高?
一些书籍记录乘法效率比除法效率高比如对于浮点数m /= 应该改写成m *= 于是我就做了如下的两个测试
C代码:
[cpp]
#include <stdioh>
#include <timeh>
main(){
long count = ;
float test = ;
int start_time end_time;
start_time = clock();
while(count > )
test /= ;
end_time = clock();
printf( test /= 耗时%d毫秒\n (end_time start_time));
getchar();
}
测试结果:平均在ms
当我们把测试代码test /= 改为 test *= 时
测试结果:平均在:ms
符合我们的期望值
再来看看同样的代码在JAVA上运行:
[java]
public class FuHaoCeshi {
public static void main(String[] args){
int count = ;
long start_time = ;
long end_time = ;
float test = ;
start_time = SystemcurrentTimeMillis();
while(count > )
test /= ;
end_time = SystemcurrentTimeMillis();
Systemoutprintln(test /= 耗时+ (end_time start_time) + ms);
count = ;
start_time = SystemcurrentTimeMillis();
while(count > )
test *=;
end_time = SystemcurrentTimeMillis();
Systemoutprintln(test *=耗时+ (end_time start_time) + ms);
}
}
测试结果:
test /= 耗时ms
test *= 耗时ms
结果竟然与VC测试下的结果完全相反!除法效率居然更高 !
问题二:长整型会造成时间翻倍?
我们把问题一JAVA程序中测试代码改成赋值运算:
[java]
public class FuHaoCeshi {
public static void main(String[] args){
int count = ;
long start_time = ;
long end_time = ;
int test = ;
start_time = SystemcurrentTimeMillis();
while(count > )
test = ;
end_time = SystemcurrentTimeMillis();
Systemoutprintln(test = 耗时+ (end_time start_time) + ms);
}
}
测试结果:
test = 耗时ms
接下来我们把上述程序中int count改成long count看看结果:
测试结果:
test = 耗时ms
纳尼!时间居然翻倍了!
接下来用同样的代码用C语言测试:
两次结果都在ms左右无变化! 纠结!
经xuchao 提醒把long改成double耗时为ms但改成float后发生死循环怎么解释?
问题三:除法和取模运算开销真的大吗?
取模是由除法实现的除法和取模的开销比较大是大家的共识于是我把上述的测试代码改成test %= ;
测试结果:
test%=耗时ms(与test = 的时间消耗一模一样)
而java测试结果:
test % =耗时ms
test = 耗时ms
这个原因其实很好想VC做了优化把摸运算优化成了位运算于是我把test %= 改成test %= ;
测试结果
test %= 耗时ms验证了我的想法(JAVA的耗时无变化貌似无优化)
但这不是重点重点是我用CFree测试了同样的代码:
[cpp]
#include <stdioh>
#include <timeh>
main(){
int count = ;
int test = ;
int start_time end_time;
start_time = clock();
while(count > )
test %= ;
end_time = clock();
printf( 耗时%d毫秒\n (end_time start_time));
getchar();
}
测试结果:
test%=耗时ms
于是我测试了 test%= 的所有质数结果一样!!
这编译器怎么优化成一样的时间消耗?同样的CPU里面的加法器乘法器除法器做的都是同样的事怎么回事?
下面还有几个其他的小问题:
对于上面的程序循环count次什么也不做平均耗时:VC:ms;CFree:msJVM:ms
为什么说C是执行效率最高的高级语言JAVA由于有JVM层是执行效率慢的语言?
经过我各方面测试JAVA最耗时的运算是test %= 上述程序达到了ms是对别的数取模耗时的倍之多;