背景:
近日,捡起了多年未用的matlab,突然发现很多函数都不会用了,只是记得有这个功能,但是,却不知道怎么写,尤其是matlab没有提示功能,写起代码真的是不习惯。因此,此时的感觉是无奈又无助。
正在烦躁无聊之际,看到群里有人发问,说c#的for循环效率高于Qt,觉得不可思议,并将代码贴到了群中,但是没有给出结果。群中很多人对代码进行了一系列批评,说数据类型不一样的,无法比较等等,但是,大家都有一个共识:即不可能效率高于Qt。
为了探查二者的效率究竟如何,觉得还是自己亲自试一下比较好,同时,也尽量使自己不做一个坐而论道者,而是亲自区验证一下。
验证过程
依据群里的代码,自己做了一些改动,如下
C#代码,c#运行环境采用visiual studio 2019 社区版,dotnet framework 4.8 。
DateTime startT = DateTime.Now;
Int64 total = 0;
for (int i = 0; i < 1000000000; i++)
{
total += i;
}
DateTime endT = DateTime.Now;
TimeSpan ts = endT - startT;
Console.WriteLine("C#-duration:" + ts.TotalMilliseconds.ToString() + "ms;total=" + total.ToString());
Qt代码,群中人采用了long long 数据类型,后面很多人回复,说longlong 和c#中的int64 不是同一种类型,没有可比性,所以,按照群中人的建议,用qint64类型,又做了一遍
// long long
QTime startT=QTime::currentTime();
long long total=0;
for (long long var = 0; var < 1000000000; ++var) {
total+=var;
}
QTime endT=QTime::currentTime();
int duration=startT.msecsTo(endT);
qDebug()<<"Qt-(long long)duration:"<<duration<<"ms;total="<<total;
// qint64 方案
//qint64
QTime startT=QTime::currentTime();
qint64 total=0;
for (qint64 var = 0; var < 1000000000; ++var) {
total+=var;
}
QTime endT=QTime::currentTime();
int duration=startT.msecsTo(endT);
qDebug()<<"Qt-(qint64)duration:"<<duration<<"ms;total="<<total;
本人电脑情况:
运行结果:
经过运行结果如下:
c#多次运行结果:
C#-duration:2946.3285ms;total=499999999500000000
C#-duration:2944.3291ms;total=499999999500000000
C#-duration:2942.3118ms;total=499999999500000000
C#-duration:2915.8663ms;total=499999999500000000
C#-duration:2948.9808ms;total=499999999500000000
C#-duration:2951.3062ms;total=499999999500000000
Qt long long 方案多次运行结果
Qt-(long long)duration: 2738 ms;total= 499999999500000000
Qt-(long long)duration: 2745 ms;total= 499999999500000000
Qt-(long long)duration: 2749 ms;total= 499999999500000000
Qt-(long long)duration: 2724 ms;total= 499999999500000000
Qt-(long long)duration: 2749 ms;total= 499999999500000000
Qt-(long long)duration: 2733 ms;total= 499999999500000000
Qt qint64方案多次运行结果
Qt-(qint64)duration: 2733 ms;total= 499999999500000000
Qt-(qint64)duration: 2720 ms;total= 499999999500000000
Qt-(qint64)duration: 2729 ms;total= 499999999500000000
Qt-(qint64)duration: 2713 ms;total= 499999999500000000
Qt-(qint64)duration: 2768 ms;total= 499999999500000000
Qt-(qint64)duration: 2717 ms;total= 499999999500000000
通过上述分析,可见c#运行速度没有Qt速度快。
同时,需要指出的是,群中C#代码输入语句写为ts.ToString(),而不是我写的ts.TotalMilliseconds.ToString(),前者在输出的时候,输出结果为【C#-duration:00:00:02.9394304ms;total=499999999500000000】,这个结果的单位实际上不是ms,这是写法错误,是不是这样导致了他认为效率远高于Qt。因此,在比较的时候,一方面要看清楚输出结果的单位,同时,在运行的时候,如果是在线监督运行结果的话,你观测结果的输出,可以有这么一种感觉,即几种方法的结果输出时间没有明显的差异。
ts输出毫秒的方式是ts.TotalMilliseconds,这应该是这个问题出错的原因。