最近在研究并行的时候与到了一个让我迷糊的问题。
先看如下代码
for (int i = 0; i < 100000; i++)
for (int k = 0; k < 100000; k++)
{
} For i As Integer = 0 To 100000
For k As Integer = 0 To 100000 Next
Next在我的计算机上运行以上两段代码分别用了4250(C#),8484(VB),C#快了一倍。
我觉得有问题,所以我把代码发给其他人让他们分别进行测试,可得到的结果却让我更迷糊了。
路人甲(Intel P8400 2.29GHz)
278945(C#),246294(VB)路人乙(Intel T7500 2.2GHz)
35381(C#),25366(VB)我的计算机(Intel E4600 2.4GHz)问题一
为何我机器上VB.NET编写的程序会比C#编写的慢一倍,而其他人的机器却都是VB的比C#的要快?问题二
为何我的计算时间会比其他人的都快了近10倍?我的CPU虽然比其他人的要好些,可也不至于有如此大的差距吧?
先看如下代码
for (int i = 0; i < 100000; i++)
for (int k = 0; k < 100000; k++)
{
} For i As Integer = 0 To 100000
For k As Integer = 0 To 100000 Next
Next在我的计算机上运行以上两段代码分别用了4250(C#),8484(VB),C#快了一倍。
我觉得有问题,所以我把代码发给其他人让他们分别进行测试,可得到的结果却让我更迷糊了。
路人甲(Intel P8400 2.29GHz)
278945(C#),246294(VB)路人乙(Intel T7500 2.2GHz)
35381(C#),25366(VB)我的计算机(Intel E4600 2.4GHz)问题一
为何我机器上VB.NET编写的程序会比C#编写的慢一倍,而其他人的机器却都是VB的比C#的要快?问题二
为何我的计算时间会比其他人的都快了近10倍?我的CPU虽然比其他人的要好些,可也不至于有如此大的差距吧?
去年做过两个snmp类库的效率测试
C++统计的时间比较符合实际
C#统计时间居然在一个socket操作后时间间隔是0,当时用的是vs2008,TimeSpan
出现几个0后,又出来一个合理的数字,崩溃后来是抓包看时间差统计的
你比别人快了近10倍? 也就是说 如果你要花10秒 人家要100秒
是不是别人在玩dota的时候测试的啊
我猜你的测试还是存在诸多干扰因素在里面
我的机器是XP,其他人的都是WIN7,不知道和这个有没有关系
得到的结论是Intel的CPU上,普遍是VB.NET稍快些,
我反编译了生成的exe程序,发现VB.NET的代码被翻译成了do-while语句,不知道和这个有关没有。AMD的CPU上测试的结果是两种语言的程序执行时间几乎相等。但所有的测试时间都没有楼主机器上那样快,我在Althon II X3(3核心 2.9GHz)上使用Paralell并行计算获得的结果都有7秒多,而楼主的机器虽然是双核,但未并行的情况下使用的是2.4GHz的单核心居然跑出了远超3核心并行的2.9GHz的CPU,这个我真不知道是为什么。
但看数据,你在路人的机器上获得的数据应该是比较合理的。没能帮楼主找出原因,希望这些测试结果可以帮到你。
1. 操作系统版本
2. CPU
3. 内存,并且是否双通道
4. 项目类型(Winform、Console、Asp.net)
这样才能统计下1. Win7 Sp2
2. 赛扬 E3300 超频到3.33G
4. 内存 3G,外频800,本人认为不是双通道,CPU-Z中显示双通道
4. Console跑分
一、C#
1. Debug
开始执行不调试 22720 开始执行调试 22625 基本一致,在误差范围内
2. Release
开始执行不调试 3120 开始执行调试 22325 相差很大二、VB
1. Debug
开始执行不调试 20545 开始执行调试 19251 基本一致,在误差范围内
2. Release
开始执行不调试 6256 开始执行调试 22136 相差很大三、以上结果都测试了多次,基本在上述结果上下浮动,可认为是误差四、VB在Release下,居然和C#相差一倍,未解五、顺便问问楼主及各位兄弟,为什么VS 2008下
1.Release模式也能调试(其实可以猜到,Release模式下,按F5生成的代码在执行效率上既然和Debug模式没差别,那其实就是Debug模式了,但仅是猜测,有没有板油有理论依据的)
2.Release模式下,DLL文件或EXE文件,也生成PDB文件(应该是调试信息吧),每次都要删除,烦啊,有没有什么办法Release模式下不生成
最后,提醒楼主,VB中的内外循环都比C#多一次,在我代码里已修正。
即使在VS2010下,Release模式也是可以调试的。
不明白为什么你的测试结果中,VB的Release模式比C#的慢一倍,我又在Release模式下进行了测试,结果是两者时间消耗几乎相等。
楼主的结果 4250(C#),8484(VB),和我结果大体表现一致。你用的是2008还是2010?
而且如果什么也不执行的话,程序该立刻显示运行时间,而不是消耗了几秒或者几十秒之久
我的机器是XP,其他人的都是WIN7,不知道和这个有没有关系
因为cpu的并行性,之间都会休眠的,时间肯定在变!
要用C++测这段程序才叫快呢:)
可加点运算以阻止编译器优化掉空循环:int dummy = 0;
for (int i = 0; i < 100000; ++i){
for (int k = 0; k < 100000; ++k)
{
dummy ^= k;
}
dummy ^= i;
}
return dummy;
http://download.csdn.net/detail/zanfeng/3658162
for (int k = 0; k < 10; k++)
{
} for (int i = 0; i < 10; i++)
for (int k = 0; k < 100000; k++)
{
}
2、操作平台:主要指操作系统,同为win平台,vista32/64、win7 32/64运行效率就不一样。
3、软件环境:主要指运行所处系统中,对效率有影响的其它软件,如后台服务、活动/待活动软件(包括迅雷、360……)
4、编译选项:主要指代码编译选项的配置情况,如效率、大小、是否需要调试……,不同软件需要有些许不同,导致编译出来的目标程序区别较大;如嵌入式软件既要小又要快,那就要牺牲许多容器和封装;而一些注重界面和人机交互的软件则不太在乎效率和大小,侧重功能;还有其它许多影响编译选项的情况。
5、运行形态:主要指是否带调试运行(即通常的F5),如果非带调运行且关闭调试项的话,软件效率就取决于前三个了,结论比较简单明了,C#/VB区别应该不大;如果是在调试环境运行,则影响因素除了前四个,还有调试环境的配置情况,如C#、VB安装的模块、开发环境选项、外部组件加载情况……
环境: win7,vs2010 sp1,CPU:Pentinum Dual-Core T4500 @2.30GHz,内存:2.00GB
debug模式下
vc:24秒
c#:33秒
release模式下
vc:7秒
c#:27秒这里注意的就是 楼上几位已经指出的,必须加入计算,否则,编译器会优化掉,不执行任何操作.各位牛人,知道这样测试没什么意义,只是玩玩而已,请不要冲动啊.代码如下:
vc代码#include <time.h>
#include <iostream>int main()
{
clock_t startDT = clock();
int dummy = 1;
for (int i = 0; i < 100000; ++i)
{
for (int k = 0; k < 100000; ++k)
{
dummy ^= k;
}
dummy ^= i;
}
std::cout<<"dummy: " << dummy << std::endl; clock_t stopDT = clock(); std::cout<<"耗时: " << (stopDT - startDT)<<std::endl;
}c#代码 class Program
{
static void Main(string[] args)
{
DateTime startDT = DateTime.Now;
int dummy = 1;
for (int i = 0; i < 100000; ++i)
{
for (int k = 0; k < 100000; ++k)
{
dummy ^= k;
}
dummy ^= i;
}
Console.WriteLine("dummy: " + dummy.ToString());
DateTime stopDT = DateTime.Now;
TimeSpan cost = stopDT - startDT;
Console.WriteLine("耗时: " + cost.TotalMilliseconds.ToString());
}
}
去年做过两个snmp类库的效率测试
C++统计的时间比较符合实际