Dav*_*ave 17 c# c++ performance
我有一个简单的C#和C++代码来计算点积的总和.
C#代码是:
using System;
namespace DotPerfTestCS
{
class Program
{
struct Point3D
{
public double X, Y, Z;
public Point3D(double x, double y, double z)
{
X = x;
Y = y;
Z = z;
}
}
static void RunTest()
{
unchecked
{
const int numPoints = 100000;
const int numIters = 100000000;
Point3D[] pts = new Point3D[numPoints];
for (int i = 0; i < numPoints; i++) pts[i] = new Point3D(i, i + 1, i + 2);
var begin = DateTime.Now;
double sum = 0.0;
var u = new Point3D(1, 2, 3);
for (int i = 0; i < numIters; i++)
{
var v = pts[i % numPoints];
sum += u.X * v.X + u.Y * v.Y + u.Z * v.Z;
}
var end = DateTime.Now;
Console.WriteLine("Sum: {0} Time elapsed: {1} ms", sum, (end - begin).TotalMilliseconds);
}
}
static void Main(string[] args)
{
for (int i = 0; i < 5; i++) RunTest();
}
}
}
Run Code Online (Sandbox Code Playgroud)
而C++是
#include <iostream>
#include <vector>
#include <time.h>
using namespace std;
typedef struct point3d
{
double x, y, z;
point3d(double x, double y, double z)
{
this->x = x;
this->y = y;
this->z = z;
}
} point3d_t;
double diffclock(clock_t clock1,clock_t clock2)
{
double diffticks=clock1-clock2;
double diffms=(diffticks*10)/CLOCKS_PER_SEC;
return diffms;
}
void runTest()
{
const int numPoints = 100000;
const int numIters = 100000000;
vector<point3d_t> pts;
for (int i = 0; i < numPoints; i++) pts.push_back(point3d_t(i, i + 1, i + 2));
auto begin = clock();
double sum = 0.0, dum = 0.0;
point3d_t u(1, 2, 3);
for (int i = 0; i < numIters; i++)
{
point3d_t v = pts[i % numPoints];
sum += u.x * v.x + u.y * v.y + u.z * v.z;
}
auto end = clock();
cout << "Sum: " << sum << " Time elapsed: " << double(diffclock(end,begin)) << " ms" << endl;
}
int main()
{
for (int i = 0; i < 5; i++) runTest();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
C#版本(发布x86,优化开启,x64甚至更慢)输出
Sum: 30000500000000 Time elapsed: 551.0299 ms
Sum: 30000500000000 Time elapsed: 551.0315 ms
Sum: 30000500000000 Time elapsed: 552.0294 ms
Sum: 30000500000000 Time elapsed: 551.0316 ms
Sum: 30000500000000 Time elapsed: 550.0315 ms
Run Code Online (Sandbox Code Playgroud)
而C++(默认VS2010发布版本设置)产生
Sum: 3.00005e+013 Time elapsed: 4.27 ms
Sum: 3.00005e+013 Time elapsed: 4.27 ms
Sum: 3.00005e+013 Time elapsed: 4.25 ms
Sum: 3.00005e+013 Time elapsed: 4.25 ms
Sum: 3.00005e+013 Time elapsed: 4.25 ms
Run Code Online (Sandbox Code Playgroud)
现在我希望C#代码会慢一些.但对我来说,慢了130倍似乎太过分了.有人可以向我解释这里发生了什么吗?
编辑
我不是C++程序员,我只是从互联网上的某处获取了diffclock代码而没有真正检查它是否正确.
使用std :: difftime,C++结果是
Sum: 3.00005e+013 Time elapsed: 457 ms
Sum: 3.00005e+013 Time elapsed: 452 ms
Sum: 3.00005e+013 Time elapsed: 451 ms
Sum: 3.00005e+013 Time elapsed: 451 ms
Sum: 3.00005e+013 Time elapsed: 451 ms
Run Code Online (Sandbox Code Playgroud)
这似乎是正确的.
Chr*_*ens 13
你的diffclock代码是错误的.
如果您更改C++代码以使用它std::clock,std::difftime它似乎显示实际的运行时:
#include <iostream>
#include <vector>
#include <ctime>
using namespace std;
typedef struct point3d
{
double x, y, z;
point3d(double x, double y, double z)
{
this->x = x;
this->y = y;
this->z = z;
}
} point3d_t;
void runTest()
{
const int numPoints = 100000;
const int numIters = 100000000;
vector<point3d_t> pts;
for (int i = 0; i < numPoints; i++) pts.push_back(point3d_t(i, i + 1, i + 2));
auto begin = clock();
double sum = 0.0, dum = 0.0;
point3d_t u(1, 2, 3);
for (int i = 0; i < numIters; i++)
{
point3d_t v = pts[i % numPoints];
sum += u.x * v.x + u.y * v.y + u.z * v.z;
}
auto end = clock();
cout << "Sum: " << sum << " Time elapsed: " << double(std::difftime(end,begin)) << " ms" << endl;
}
int main()
{
for (int i = 0; i < 5; i++) runTest();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
结果:
Sum: 3.00005e+013 Time elapsed: 346 ms
Sum: 3.00005e+013 Time elapsed: 344 ms
Sum: 3.00005e+013 Time elapsed: 346 ms
Sum: 3.00005e+013 Time elapsed: 347 ms
Sum: 3.00005e+013 Time elapsed: 347 ms
Run Code Online (Sandbox Code Playgroud)
这是在vs2010之外的默认发布模式优化中运行应用程序.
正如其他人所指出的那样,在C++中使用clock()并不是计算时间的最准确方法(如在C#中,Stopwatch优于DateTime).
如果您使用的是Windows,则可以始终使用QueryPerformanceCounter进行高分辨率计时.
我相信你会发现你的diffclock实现产生十分之一秒,而不是毫秒(假设CLOCKS_PER_SECOND准确命名).纠正这个问题,C#实现运行速度大约慢了30%,这似乎是合适的.