C ++和C#速度测试 - 奇怪的结果

时间:2014-06-19 05:08:50

标签: c# c++ execution

对于我需要高速计算的新项目,我试图在C ++和C#之间进行选择。我总是听说C#速度合理。我知道C和C ++的速度比较慢,但我的例外是差异并不大!所以我用C ++和C#编写了两个代码来自己测试它们。

C ++的结果是5:09到5:55秒,C#的结果是11408到11960秒。

我的代码出了问题,或者这就是它的真实含义? 这是我的C ++代码:

clock_t tStart = clock();
std::ofstream myfile;
myfile.open("log.txt");
std::string pi;

int limit = 50;
for (int i = 0; i < limit; i++)
{
    for (int j = 0; j < limit; j++)
    {
        for (int k = 0; k < limit; k++)
        {
            double val = sin(i *i + j *j + k *k);
            pi = std::to_string(val);
            myfile << pi<<"\n";
        }
    }
}
myfile.close();
printf("Time taken: %.2fs\n", (double)(clock() - tStart) / CLOCKS_PER_SEC);
getchar();
return 0;

这是我的C#代码:

Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
string path = @"c:\log.txt";
int limit = 50;
for (int i = 0; i < limit; i++)
{
     for (int j = 0; j < limit; j++)
     {
          for (int k = 0; k < limit; k++)
          {
                double val = Math.Sin(i *i + j *j + k *k);
                using (StreamWriter sw = File.AppendText(path))
                {
                    sw.WriteLine(val.ToString("F6"));
                }
          }
     }
}
stopwatch.Stop();
Console.Write(stopwatch.ElapsedMilliseconds);
Console.ReadKey(true);

我的操作系统是Win7 64位。 提前感谢您的时间。

@EDIT:为什么要改变     double val = Math.Sin(i * i + j * j + k * k); 至     double val = Math.Sin(i ^ 2 + j ^ 2 + k ^ 2); 在C#中,会产生完全不同的答案吗?

2 个答案:

答案 0 :(得分:3)

for (int j = 0; j < limit; j++)
{
    for (int k = 0; k < limit; k++)
    {
        using (StreamWriter sw = File.AppendText(path))
        {
            //...
        }          
    }
}

您的结果并不令人惊讶 - 您正在打开文件,并在每次迭代时创建和处置StreamWriter。你应该创建一次:

using (StreamWriter sw = File.AppendText(path))
{
    for (int j = 0; j < limit; j++)
    {
        for (int k = 0; k < limit; k++)
        {
                //...   
        }
    }
}

答案 1 :(得分:2)

你的测试的最大区别在于,对于C ++,你打开并关闭循环外的文件,这意味着它只发生一次。

在C#测试中,您将打开文件,将文件搜索到最后,然后在每次迭代时关闭它。这将是一个巨大的时间下沉。

您应该将编写器的创建移动到循环上方,然后在退出循环后关闭它。

我正在引用代码

        using (StreamWriter sw = File.AppendText(path))
        {
            sw.WriteLine(val.ToString("F6"));
        }