290

还是现在反过来了?

据我所知,在某些领域 C# 被证明比 C++ 更快,但我从来没有勇气自己测试它。

认为你们中的任何人都可以详细解释这些差异,或者将我指向正确的位置以获取有关此信息的信息。

4

30 回答 30

391

没有严格的理由为什么像 C# 或 Java 这样具有 JIT 的基于字节码的语言不能像 C++ 代码一样快。然而,C++ 代码在很长一段时间内都明显更快,今天在许多情况下仍然如此。这主要是因为更高级的 JIT 优化实现起来很复杂,而真正酷的优化才刚刚出现。

因此,在许多情况下,C++ 更快。但这只是答案的一部分。C++ 实际上更快的情况是高度优化的程序,专业程序员彻底优化了代码。这不仅非常耗时(因此也很昂贵),而且由于过度优化通常会导致错误。

另一方面,解释语言中的代码在运行时的更高版本(.NET CLR 或 Java VM)中变得更快,而无需您做任何事情。JIT 编译器可以进行许多有用的优化,而这些优化在具有指针的语言中是根本不可能的。此外,有些人认为垃圾收集通常应该与手动内存管理一样快或更快,而且在许多情况下确实如此。您通常可以在 C++ 或 C 中实现和实现所有这些,但它会更加复杂且容易出错。

正如 Donald Knuth 所说,“过早的优化是万恶之源”。如果您真的确定您的应用程序将主要包含对性能至关重要的算术,并且它将成为瓶颈,并且在 C++ 中它肯定会更快,并且您确定 C++ 不会与您的其他要求,去C++。在任何其他情况下,首先集中精力以最适合您的语言正确实现您的应用程序,然后在运行速度太慢时找到性能瓶颈,然后考虑如何优化代码。在最坏的情况下,您可能需要通过外部函数接口调用 C 代码,因此您仍然有能力用低级语言编写关键部分。

请记住,优化一个正确的程序相对容易,但要纠正一个优化的程序要困难得多。

给出速度优势的实际百分比是不可能的,这在很大程度上取决于您的代码。在许多情况下,编程语言的实现甚至不是瓶颈。在http://benchmarksgame.alioth.debian.org/上进行基准测试时,要抱有很大的怀疑态度,因为这些主要测试算术代码,这很可能与您的代码根本不相似。

于 2008-09-26T09:10:17.873 回答
237

C# 可能不会更快,但它让 YOU/ME 更快。这是我所做的最重要的衡量标准。:)

于 2008-09-26T09:22:38.657 回答
126

我将首先不同意对这个问题的部分接受(和好评)的回答,并说明:

实际上,JITted 代码比经过适当优化的 C++(或其他没有运行时开销的语言)程序运行得慢的原因有很多,包括:

  • 根据定义,在运行时 JITting 代码上花费的计算周期不可用于程序执行。

  • JITter 中的任何热路径都将与您的代码竞争 CPU 中的指令和数据缓存。我们知道缓存在性能方面占主导地位,而像 C++ 这样的原生语言在设计上没有这种类型的争用。

  • 运行时优化器的时间预算必然编译时优化器的更受限制(正如另一位评论者指出的那样)

底线:最终,您几乎肯定能够在 C++ 中创建比在 C# 中更快的实现

现在,话虽如此,实际上有多快是无法量化的,因为变量太多:任务、问题域、硬件、实现质量以及许多其他因素。您将在您的场景中运行测试以确定性能差异,然后决定是否值得付出额外的努力和复杂性。

这是一个非常长且复杂的话题,但为了完整起见,我觉得值得一提的是,C# 的运行时优化器非常出色,并且能够在运行时执行某些动态优化,而这些动态优化对于 C++ 的编译时根本不可用(静态)优化器。即便如此,优势仍然通常在本机应用程序的法庭上很深,但动态优化器是上面给出的“几乎可以肯定”限定词的原因。

--

在相对表现方面,我也对我在其他一些答案中看到的数字和讨论感到不安,所以我想我会插话,同时为我上面的陈述提供一些支持。

这些基准测试的很大一部分问题是您不能像编写 C# 一样编写 C++ 代码并期望获得具有代表性的结果(例如,在 C++ 中执行数千次内存分配会给您带来可怕的数字。)

相反,我编写了稍微惯用的 C++ 代码,并与 @Wiory 提供的 C# 代码进行了比较。我对 C++ 代码所做的两个主要更改是:

  1. 使用向量::reserve()

  2. 将 2d 数组展平为 1d 以实现更好的缓存局部性(连续块)

C# (.NET 4.6.1)

private static void TestArray()
{
    const int rows = 5000;
    const int columns = 9000;
    DateTime t1 = System.DateTime.Now;
    double[][] arr = new double[rows][];
    for (int i = 0; i < rows; i++)
        arr[i] = new double[columns];
    DateTime t2 = System.DateTime.Now;

    Console.WriteLine(t2 - t1);

    t1 = System.DateTime.Now;
    for (int i = 0; i < rows; i++)
        for (int j = 0; j < columns; j++)
            arr[i][j] = i;
    t2 = System.DateTime.Now;

    Console.WriteLine(t2 - t1);
}

运行时间(发布):初始化:124 毫秒,填充:165 毫秒

C++14 (Clang v3.8/C2)

#include <iostream>
#include <vector>

auto TestSuite::ColMajorArray()
{
    constexpr size_t ROWS = 5000;
    constexpr size_t COLS = 9000;

    auto initStart = std::chrono::steady_clock::now();

    auto arr = std::vector<double>();
    arr.reserve(ROWS * COLS);

    auto initFinish = std::chrono::steady_clock::now();
    auto initTime = std::chrono::duration_cast<std::chrono::microseconds>(initFinish - initStart);

    auto fillStart = std::chrono::steady_clock::now();

    for(auto i = 0, r = 0; r < ROWS; ++r)
    {
        for (auto c = 0; c < COLS; ++c)
        {
            arr[i++] = static_cast<double>(r * c);
        }
    }

    auto fillFinish = std::chrono::steady_clock::now();
    auto fillTime = std::chrono::duration_cast<std::chrono::milliseconds>(fillFinish - fillStart);

    return std::make_pair(initTime, fillTime);
}

运行时间(发布):初始化:398µs(是的,那是微秒),填充:152ms

总运行时间:C#:289 毫秒,C++ 152 毫秒(大约快 90%)

观察

  • 将 C# 实现更改为相同的一维数组实现会产生 Init:40ms,Fill:171ms,Total:211ms(C++ 仍然快 40%)。

  • 用 C++ 设计和编写“快速”代码比用任何一种语言编写“常规”代码要困难得多。

  • 在 C++ 中表现不佳(也许)非常容易;我们看到了无保留向量的性能。而且有很多这样的陷阱。

  • 考虑到运行时发生的所有事情,C# 的性能相当惊人。而且这种性能相对容易获得。

  • 比较 C++ 和 C# 性能的更多轶事数据:https ://benchmarksgame.alioth.debian.org/u64q/compare.php?lang=gpp&lang2=csharpcore

最重要的是,C++ 让您可以更好地控制性能。你想使用指针吗?参考?堆栈内存?堆?动态多态性还是消除具有静态多态性的 vtable 的运行时开销(通过模板/CRTP)?在 C++ 中,您必须……呃,自己做出所有这些选择(甚至更多),理想情况下,这样您的解决方案才能最好地解决您正在解决的问题。

问问自己,您是否真的想要或需要这种控制,因为即使对于上面的微不足道的示例,您也可以看到虽然性能有了显着提高,但需要更深入的投资才能访问。

于 2016-09-08T09:39:44.757 回答
91

快了五个橙子。或者更确切地说:不可能有(正确的)一揽子答案。C++ 是一种静态编译语言(但也有配置文件引导优化),C# 在 JIT 编译器的帮助下运行。存在如此多的差异,以至于无法回答诸如“快多少”之类的问题,即使给出数量级也无法回答。

于 2008-09-26T09:05:32.817 回答
64

根据我的经验(我在这两种语言上做了很多工作),与 C++ 相比,C# 的主要问题是内存消耗高,我还没有找到控制它的好方法。最终会降低 .NET 软件速度的是内存消耗。

另一个因素是 JIT 编译器不能花太多时间进行高级优化,因为它在运行时运行,如果花费太多时间最终用户会注意到它。另一方面,C++ 编译器有所有时间在编译时进行优化。这个因素远没有内存消耗那么重要,恕我直言。

于 2008-09-26T14:02:27.990 回答
36

当多态决策可以在编译时预先确定时,C++ 仍然占上风(并且将在未来几年内)的一种特殊情况发生。

一般来说,封装和延迟决策是一件好事,因为它使代码更加动态,更容易适应不断变化的需求,更容易作为框架使用。这就是为什么 C# 中的面向对象编程非常高效,并且可以在术语“泛化”下进行泛化。不幸的是,这种特殊的泛化在运行时是有代价的。

通常,这个成本是非实质性的,但在某些应用程序中,虚拟方法调用和对象创建的开销可能会产生影响(特别是因为虚拟方法会阻止其他优化,例如方法调用内联)。这就是 C++ 具有巨大优势的地方,因为您可以使用模板来实现不同类型的泛化,这对运行时没有影响,但不一定比 OOP 多态。事实上,构成 OOP 的所有机制都可以仅使用模板技术和编译时解析来建模。

在这种情况下(诚然,它们通常仅限于特殊问题领域),C++ 胜过 C# 和类似语言。

于 2008-09-26T09:26:57.037 回答
20

C++(或 C)让您对数据结构进行细粒度控制。如果你想旋转,你有这个选项。使用 Java/.NET 库的内部数据结构的大型托管 Java 或 .NET 应用程序(OWB、Visual Studio 2005)随身携带。我已经看到 OWB 设计器会话使用超过 400 MB 的 RAM 和用于立方体或ETL设计的 BIDS 也达到了 100 MB。

在可预测的工作负载上(例如大多数重复过程多次的基准测试),JIT 可以为您提供优化得足够好的代码,从而没有实际差异。

IMO 在大型应用程序上的区别与其说是 JIT,不如说是代码本身使用的数据结构。在应用程序占用大量内存的情况下,您的缓存使用效率会降低。现代 CPU 上的缓存未命中非常昂贵。C 或 C++ 真正胜出的地方是您可以优化数据结构的使用以与 CPU 缓存很好地配合使用。

于 2008-09-26T09:55:49.090 回答
19

对于图形,标准 C# Graphics 类比通过 C/C++ 访问的 GDI 慢得多。我知道这与语言本身无关,更多的是与整个 .NET 平台有关,但图形是作为 GDI 替代品提供给开发人员的,它的性能太差了,我什至不敢做图形用它。

我们有一个简单的基准来查看图形库的速度,它只是在窗口中绘制随机线。C++/GDI 在 10000 行时仍然很敏捷,而 C#/Graphics 很难实时做到 1000 行。

于 2008-09-26T20:13:41.997 回答
13

垃圾收集是 Java# 不能用于实时系统的主要原因。

  1. GC什么时候发生?

  2. 需要花多长时间?

这是不确定的。

于 2008-12-08T13:46:02.643 回答
11

我们必须确定 C# 在性能上是否与 C++ 相当,我为此编写了一些测试程序(两种语言都使用 Visual Studio 2005)。事实证明,没有垃圾收集,只考虑语言(而不是框架)C# 与 C++ 具有基本相同的性能。C# 中的内存分配比 C++ 中的快得多,并且当数据大小增加到超出缓存线边界时,C# 在确定性方面略有优势。然而,所有这些最终都必须付出代价,并且由于垃圾收集,C# 的非确定性性能损失会带来巨大的成本。

于 2008-12-29T22:26:57.693 回答
11

C/C++ 在有大型数组或对数组(任何大小)进行大量循环/迭代的程序中可以表现得更好。这就是图形在 C/C++ 中通常要快得多的原因,因为繁重的数组操作几乎是所有图形操作的基础。由于所有安全检查,.NET 在数组索引操作方面的速度是出了名的慢,对于多维数组尤其如此(是的,矩形 C# 数组甚至比锯齿状 C# 数组还要慢)。

如果您直接使用指针并避免使用 Booststd::vector和其他高级容器以及inline所有可能的小函数,则 C/C++ 的好处最为明显。尽可能使用老式数组。是的,您将需要更多的代码行来完成您在 Java 或 C# 中所做的相同事情,因为您避免使用高级容器。如果您需要一个动态大小的数组,您只需要记住将您的new T[]与相应的delete[]语句配对(或使用std::unique_ptr)——额外速度的代价是你必须更仔细地编码。但作为交换,您可以摆脱托管内存/垃圾收集器的开销,这很容易占 Java 和 .NET 中大量面向对象的程序以及那些大规模托管的执行时间的 20% 或更多内存数组索引成本。在某些特定情况下,C++ 应用程序也可以从一些漂亮的编译器开关中受益。

我是 C、C++、Java 和 C# 方面的专家级程序员。我最近难得有机会用后 3 种语言实现完全相同的算法程序。该程序有很多数学和多维数组操作。我在所有 3 种语言中都对它进行了大量优化。结果是我通常在不太严格的比较中看到的典型结果:Java 比 C# 快约 1.3 倍(大多数 JVM 比 CLR 更优化),C++ 原始指针版本比 C# 快约 2.1 倍。请注意,C# 程序只使用了安全代码——我认为您最好在使用unsafe关键字之前用 C++ 对其进行编码。

以免有人认为我反对 C#,最后我会说 C# 可能是我最喜欢的语言。它是迄今为止我遇到的最合乎逻辑、最直观和最快速的开发语言。我在 C# 中完成所有原型设计。与 Java 相比,C# 语言有许多细微的优势(是的,我知道微软有机会通过较晚进入游戏并复制 Java 来解决 Java 的许多缺点)。有人为 Java 的Calendar班级干杯吗?如果 Microsoft 真正花精力优化 CLR 和 .NET JITter,C# 可能会严重接管。老实说,我很惊讶他们还没有——他们用 C# 语言做了很多正确的事情,为什么不跟进重击的编译器优化呢?也许如果我们都乞求。

于 2015-12-29T00:47:29.850 回答
10

我知道这不是您要问的,但 C# 通常比 C++ 更快这在商业环境中是一个很大的好处。

于 2008-09-26T14:06:25.670 回答
9

像往常一样,这取决于应用程序。在某些情况下,C# 的速度可能可以忽略不计,而在其他情况下,C++ 的速度会快 5 倍或 10 倍,尤其是在操作很容易进行 SIMD 处理的情况下。

于 2008-09-26T09:16:49.247 回答
8

> 据我所知...

您的困难似乎在于确定您所听到的内容是否可信,而当您尝试评估本网站上的回复时,这种困难只会再次出现。

您将如何确定人们在这里所说的话是否比您最初听到的更可信?

一种方法是要求提供证据

当有人声称“在某些领域 C# 被证明比 C++ 更快”时,问他们为什么这么说,让他们给你看测量结果,让他们给你看程序。有时他们只是犯了一个错误。有时你会发现他们只是在表达一种观点,而不是分享他们可以证明是真实的东西。

通常,信息和意见会与人们声称的内容混在一起,您必须尝试找出哪个是哪个。例如,来自这个论坛的回复:

  • “以极大的怀疑态度来获取http://shootout.alioth.debian.org/上的基准,因为这些主要测试算术代码,这很可能与您的代码根本不相似。”

    问问自己,你是否真的理解“这些经过大量测试的算术代码”是什么意思,然后问问自己作者是否真的向你证明了他的说法是正确的。

  • “这是一个相当无用的测试,因为它实际上取决于各个程序的优化程度;我已经设法将其中一些程序加速了 4-6 倍或更多,这表明未优化程序之间的比较相当愚蠢的。”

    问问你自己,作者是否真的向你展示了他已经设法“将其中一些加速了 4-6 倍或更多”——这是一个很容易提出的主张!

于 2008-09-26T19:28:23.057 回答
6

对于“令人尴尬的并行”问题,在 C++ 上使用英特尔 TBB 和 OpenMP 时,我观察到与使用 C# 和 TPL 完成的类似(纯数学)问题相比,性能提高了大约 10 倍。SIMD 是 C# 无法竞争的一个领域,但我也觉得 TPL 有相当大的开销。

也就是说,我只将 C++ 用于我知道我将能够多线程并快速获得结果的性能关键任务。对于其他所有内容,C#(有时是 F#)就可以了。

于 2009-04-30T11:39:28.427 回答
5

这是一个非常模糊的问题,没有真正的明确答案。

例如; 我宁愿玩用 C++ 创建的 3D 游戏,也不愿玩 C#,因为性能肯定要好得多。(而且我知道 XNA 等,但它与真实的东西相去甚远)。

另一方面,如前所述;您应该使用一种可以让您快速完成您想做的事情的语言进行开发,然后在必要时进行优化。

于 2008-09-26T10:02:13.897 回答
4

理论上,对于长时间运行的服务器类型的应用程序,JIT 编译的语言可以比本地编译的语言快得多由于 JIT 编译语言通常首先编译为相当低级的中间语言,因此无论如何您都可以在编译时进行很多高级优化。最大的优势在于 JIT 可以继续动态地重新编译代码部分,因为它可以获得越来越多的关于应用程序如何使用的数据。它可以安排最常见的代码路径,以使分支预测尽可能多地成功。它可以重新排列经常一起调用的单独代码块,以将它们都保存在缓存中。它可以花更多的精力优化内部循环。

我怀疑这是由 .NET 或任何 JRE 完成的,但在我上大学时正在研究它,所以认为这些事情可能很快就会进入现实世界并不是没有道理的.

于 2008-09-27T16:38:38.433 回答
4

需要大量内存访问的应用程序,例如。图像处理通常最好在非托管环境 (C++) 中编写而不是在托管 (C#) 中编写。使用指针算法优化的内部循环在 C++ 中更容易控制。在 C# 中,您可能需要使用不安全的代码才能获得接近相同的性能。

于 2008-12-11T13:54:37.600 回答
4

.NET 语言可以与 C++ 代码一样快,甚至更快,但 C++ 代码将具有更恒定的吞吐量,因为 .NET 运行时必须为GC暂停,即使它的暂停非常聪明。

因此,如果您有一些代码必须始终快速运行而没有任何停顿,即使您对运行时 GC 非常小心,.NET 也会在某些时候引入延迟。

于 2010-04-01T07:06:03.013 回答
4

我已经vector在 C++ 和 C# 等价物List以及简单的二维数组中进行了测试。

我正在使用 Visual C#/C++ 2010 Express 版本。这两个项目都是简单的控制台应用程序,我已经在标准(无自定义设置)发布和调试模式下对它们进行了测试。C# 列表在我的电脑上运行得更快,数组初始化在 C# 中也更快,数学运算更慢。

我正在使用 Intel Core2Duo P8600@2.4GHz,C# - .NET 4.0。

我知道向量实现与 C# 列表不同,但我只是想测试用于存储对象的集合(并且能够使用索引访问器)。

当然,您需要清除内存(假设每次使用new),但我想保持代码简单。

C++ 向量测试

static void TestVector()
{
    clock_t start,finish;
    start=clock();
    vector<vector<double>> myList=vector<vector<double>>();
    int i=0;
    for( i=0; i<500; i++)
    {
        myList.push_back(vector<double>());
        for(int j=0;j<50000;j++)
            myList[i].push_back(j+i);
    }
    finish=clock();
    cout<<(finish-start)<<endl;
    cout<<(double(finish - start)/CLOCKS_PER_SEC);
}

C#列表测试:

private static void TestVector()
{

    DateTime t1 = System.DateTime.Now;
    List<List<double>> myList = new List<List<double>>();
    int i = 0;
    for (i = 0; i < 500; i++)
    {
        myList.Add(new List<double>());
        for (int j = 0; j < 50000; j++)
            myList[i].Add(j *i);
    }
    DateTime t2 = System.DateTime.Now;
    Console.WriteLine(t2 - t1);
}

C++ - 数组:

static void TestArray()
{
    cout << "Normal array test:" << endl;
    const int rows = 5000;
    const int columns = 9000;
    clock_t start, finish;

    start = clock();
    double** arr = new double*[rows];
    for (int i = 0; i < rows; i++)
        arr[i] = new double[columns];
    finish = clock();

    cout << (finish - start) << endl;

    start = clock();
    for (int i = 0; i < rows; i++)
        for (int j = 0; j < columns; j++)
            arr[i][j] = i * j;
    finish = clock();

    cout << (finish - start) << endl;
}

C# - 数组:

private static void TestArray()
{
    const int rows = 5000;
    const int columns = 9000;
    DateTime t1 = System.DateTime.Now;
    double[][] arr = new double[rows][];
    for (int i = 0; i < rows; i++)
        arr[i] = new double[columns];
    DateTime t2 = System.DateTime.Now;

    Console.WriteLine(t2 - t1);

    t1 = System.DateTime.Now;
    for (int i = 0; i < rows; i++)
        for (int j = 0; j < columns; j++)
            arr[i][j] = i * j;
    t2 = System.DateTime.Now;

    Console.WriteLine(t2 - t1);

}

时间:(发布/调试)

C++

  • 600 / 606 ms 数组初始化,
  • 200 / 270 ms 阵列填充,
  • 1 秒/13 秒矢量初始化和填充。

(是的,13 秒,我总是在调试模式下遇到列表/向量的问题。)

C#:

  • 20 / 20 ms 数组初始化,
  • 403 / 440 ms 阵列填充,
  • 710 / 742 毫秒列表初始化和填充。
于 2011-05-10T15:36:55.653 回答
3

这要看情况。如果字节码被翻译成机器码(而不仅仅是 JIT)(我的意思是如果你执行程序)并且如果你的程序使用许多分配/释放它可能会更快,因为GC算法只需要一次通过(理论上)通过整个内存一次,但正常的 malloc/realloc/free C/C++ 调用会导致每次调用的开销(调用开销、数据结构开销、缓存未命中;))。

所以理论上是可能的(也适用于其他 GC 语言)。

对于大多数应用程序,我并没有真正看到不能将元编程与 C# 一起使用的极端劣势,因为大多数程序员无论如何都不使用它。

另一个很大的优势是 SQL 与LINQ “扩展”一样,为编译器提供了优化对数据库的调用的机会(换句话说,编译器可以将整个 LINQ 编译为一个“blob”二进制文件,其中被调用的函数被内联或为您的使用进行了优化,但我在这里推测)。

于 2010-07-17T16:22:28.820 回答
2

我想有一些用 C# 编写的应用程序运行得很快,还有更多的 C++ 编写的应用程序运行得很快(好吧,C++ 更老了......而且也采用 UNIX......)
- 问题确实是 - 那是什么东西,用户和开发人员抱怨......
好吧,恕我直言,在 C# 的情况下,我们有非常舒适的 UI、非常好的库层次结构和 CLI 的整个界面系统。在 C++ 的情况下,我们有模板、ATL、COM、MFC 以及已经编写和运行的代码,如 OpenGL、DirectX 等......在一秒钟内 - 砰!它卡住了)。
用 C# 编写代码非常简单和快速(不要忘记这也会增加出错的机会。在 C++ 的情况下,开发人员抱怨内存泄漏, - 意味着崩溃,DLL 之间的调用,以及“DLL 地狱” - 问题与支持和用更新的库替换库...
我认为您在编程语言方面拥有的技能越多,您的软件的质量(和速度)就越高。

于 2008-09-26T17:06:31.573 回答
2

我会这样说:编写更快代码的程序员,是更了解是什么使当前机器运行得更快的程序员,顺便说一句,他们也是使用适当工具的人,该工具允许精确的低级和确定性优化技术。由于这些原因,这些人是使用 C/C++ 而不是 C# 的人。我会尽可能地说明这是一个事实。

于 2016-05-07T23:15:55.150 回答
2

如果我没记错的话,C# 模板是在运行时确定的。这必须比 C++ 的编译时模板慢。

当您考虑到许多其他人提到的所有其他编译时优化,以及缺乏安全性时,确实意味着更高的速度......

我想说 C++ 在原始速度和最小内存消耗方面是显而易见的选择。但这也意味着有更多时间开发代码并确保您不会泄漏内存或导致任何空指针异常。

判决:

  • C#:更快的开发,更慢的运行

  • C++:开发慢,运行快。

于 2016-07-12T17:01:23.810 回答
2

C# 和 C++ 在性能方面存在一些主要差异:

  • C# 是基于 GC / 堆的。由于内存访问的非局部性,分配和 GC 本身是开销
  • 多年来,C++ 优化器已经变得非常好。JIT 编译器无法达到相同的水平,因为它们只有有限的编译时间并且看不到全局范围

除此之外,程序员的能力也很重要。我见过糟糕的 C++ 代码,其中类在各处都按值作为参数传递。如果您不知道自己在做什么,实际上可以使 C++ 中的性能更差。

于 2019-06-20T19:00:23.637 回答
2

我发现这个 2020 年 4 月的内容是:https ://www.quora.com/Why-is-C-so-slow-compared-to-Python ,作者是一位拥有 15 年以上软件开发经验的真实程序员。

它指出 C# 通常较慢,因为它被编译为通用中间语言 (CIL)而不是 C++ 之类的机器代码。CIL 然后通过输出机器代码的公共语言运行时 (CLR) 。但是,如果您继续执行 C#,它将获取机器代码的输出并将其缓存,以便保存机器代码以供下次执行。总而言之,如果您执行多次, C# 会更快,因为它在多次执行后处于机器代码中。

也有评论说,一个好的 C++ 程序员可以做一些耗时的优化,最终会得到优化。

于 2020-09-01T16:32:49.033 回答
1

> 毕竟,答案必须在某个地方,不是吗?:)

嗯,没有。

正如一些答复所指出的,该问题的具体说明不足,以引起回应而不是回答的方式提出问题。采取一种方式:

然后是哪些程序?哪台机器?哪个操作系统?哪个数据集?

于 2008-09-27T15:59:21.977 回答
1

这实际上取决于您要在代码中完成什么。我听说 VB.NET、C# 和托管 C++ 之间存在任何性能差异只是都市传说。但是,我发现,至少在字符串比较中,托管 C++ 胜过 C#,而 C# 又胜过 VB.NET。

我从来没有对语言之间的算法复杂性进行过详尽的比较。我也只是使用每种语言的默认设置。在 VB.NET 中,我使用设置来要求声明变量等。这是我用于托管 C++ 的代码:(如您所见,此代码非常简单)。我在带有 .NET 4.6.2 的 Visual Studio 2013 中以其他语言运行相同的程序。

#include "stdafx.h"

using namespace System;
using namespace System::Diagnostics;

bool EqualMe(String^ first, String^ second)
{
    return first->Equals(second);
}
int main(array<String ^> ^args)
{
    Stopwatch^ sw = gcnew Stopwatch();
    sw->Start();
    for (int i = 0; i < 100000; i++)
    {
        EqualMe(L"one", L"two");
    }
    sw->Stop();
    Console::WriteLine(sw->ElapsedTicks);
    return 0;
}
于 2018-04-07T06:37:13.567 回答
0

我在 C++ 与 C# 中检测代码的一个领域是创建与 SQL Server 的数据库连接并返回结果集。我比较了 C++(ODBC 上的薄层)与 C#(ADO.NET SqlClient),发现 C++ 比 C# 代码快 50%。ADO.NET 应该是用于处理数据库的低级接口。您看到的可能更大的差异在于内存消耗而不是原始速度。

使 C++ 代码更快的另一件事是,您可以在粒度级别调整编译器选项,以 C# 中无法做到的方式优化事物。

于 2021-03-21T03:22:02.057 回答
-13

受此启发,我对大多数程序所需的 60% 的常用指令进行了快速测试。

这是 C# 代码:

for (int i=0; i<1000; i++)
{
    StreamReader str = new StreamReader("file.csv");
    StreamWriter stw = new StreamWriter("examp.csv");
    string strL = "";
    while((strL = str.ReadLine()) != null)
    {
        ArrayList al = new ArrayList();
        string[] strline = strL.Split(',');
        al.AddRange(strline);
        foreach(string str1 in strline)
        {
            stw.Write(str1 + ",");
        }
        stw.Write("\n");
    }
    str.Close();
    stw.Close();
}

字符串数组和数组列表是专门用来包含这些指令的。

这是C++代码:

for (int i = 0; i<1000; i++)
{
    std::fstream file("file.csv", ios::in);
    if (!file.is_open())
    {
        std::cout << "File not found!\n";
        return 1;
    }

    ofstream myfile;
    myfile.open ("example.txt");
    std::string csvLine;

    while (std::getline(file, csvLine))
    {
        std::istringstream csvStream(csvLine);
        std::vector csvColumn;
        std::string csvElement;

        while( std::getline(csvStream, csvElement, ‘,’) )
        {
            csvColumn.push_back(csvElement);
        }

        for (std::vector::iterator j = csvColumn.begin(); j != csvColumn.end(); ++j)
        {
            myfile << *j << ", ";
        }

        csvColumn.clear();
        csvElement.clear();
        csvLine.clear();
        myfile << "\n";
    }
    myfile.close();
    file.close();
}

我使用的输入文件大小为 40 KB。

这是结果 -

  • C++ 代码在 9 秒内运行。
  • C# 代码:4 秒!!!

哦,但这是在 Linux 上……在Mono上运行 C# ……而在 G++ 上运行 C++。

好的,这就是我在 Windows 上得到的——Visual Studio 2003

  • C# 代码在 9 秒内运行。
  • C++ 代码——可怕的 370 秒!!!
于 2010-03-31T13:46:07.947 回答