为什么C如此之快,为什么不是其他语言更快或更快?

在收听StackOverflow播客时,刺拳持续出现“真正的程序员”用C编写,并且C更快,因为它“靠近机器”。 如果把前面的断言留给另一篇文章,C的特殊之处在于它比其他语言更快? 或者换一种说法:阻止其他语言能够编译成与C一样快速运行的二进制文件?


对C来说没什么特别的。这就是速度很快的原因之一。

支持垃圾收集,动态输入和其他便于程序员编写程序的设备的新语言。

问题是,还有额外的处理开销会降低应用程序的性能。 C没有这些,这意味着没有开销,但这意味着程序员需要能够分配内存并释放它们以防止内存泄漏,并且必须处理变量的静态类型。

也就是说,Java(带有Java虚拟机)和.NET(带有它的通用语言运行时)在内的许多语言和平台多年来的性能得到了提高,例如即时编译字节码来实现更高的性能。


C设计师已经做出了一些折衷。 也就是说,他们决定把速度放在安全之上。 C不会

  • 检查数组索引边界
  • 检查未初始化的变量值
  • 检查内存泄漏
  • 检查空指针取消引用
  • 当您将数组索引到数组中时,在Java中它会在虚拟机中进行一些方法调用,绑定检查和其他健全性检查。 这是有效的,绝对没问题,因为它增加了安全性。 但是在C语言中,即使是很琐碎的事情也没有安全。 例如,C不需要memcpy来检查要复制的区域是否重叠。 它不是作为编写大型商业应用程序的语言而设计的。

    但是这些设计决策并不是C语言中的错误。 它们是有设计的,因为它允许编译器和库编写者从计算机中获得每一点性能。 以下是C原理文件如何解释它的精神:

    C代码可以是不可移植的。 虽然它努力给程序员提供编写真正可移植程序的机会,但委员会并不希望强制程序员写作,以避免将C用作“高级汇编程序”:能够编写特定于机器的程序代码是C的强项之一

    保持C的精神。委员会一直是维护C的传统精神的主要目标。C的精神有很多方面,但其实质是社区对C语言所依据的基本原则的看法。 C的精神的一些方面可以总结为像

  • 相信程序员。
  • 不要阻止程序员去做需要做的事情。
  • 保持语言小而简单。
  • 只提供一种方法来执行操作。
  • 快速,即使它不能保证便携。
  • 最后一句谚语需要一点解释。 有效代码生成的潜力是C最重要的优势之一。为了确保看起来非常简单的操作不会出现代码爆炸,许多操作被定义为目标机器的硬件如何实现而不是通过一般抽象规则。 在处理用于表达式的char对象扩展的规则中可以看到这种愿意接受机器所做的事情的例子:char对象的值是否扩大为有符号或无符号数量通常取决于哪个字节操作更多在目标机器上高效。


    如果你花了一个月的时间在C中创建一些运行时间为0.05秒的东西,并且我花了一天时间用Java编写相同的东西,并且它运行在0.10秒内,那么C真的更快?

    但是要回答你的问题, 编写良好的 C代码通常比其他语言编写的代码运行得更快,因为编写C代码的一部分“很好”包括在接近机器级别进行手动优化。

    尽管编译器确实非常聪明,但他们还没有能够创造性地想出与手按摩算法竞争的代码(假设“手”属于一个优秀的 C程序员)。

    编辑:

    很多评论都是基于“我用C写的,我没有考虑优化”。

    但要从这篇文章中拿出一个具体的例子:

    在Delphi中,我可以这样写:

    function RemoveAllAFromB(a, b: string): string;
    var
      before, after :string;
    begin
      Result := b;
      if 0 < Pos(a,b) then begin
        before := Copy(b,1,Pos(a,b)-Length(a));
        after := Copy(b,Pos(a,b)+Length(a),Length(b));
        Result := before + after;
        Result := RemoveAllAFromB(a,Result);  //recursive
      end;
    end;
    

    并在CI中写道:

    char *s1, *s2, *result; /* original strings and the result string */
    int len1, len2; /* lengths of the strings */
    for (i = 0; i < len1; i++) {
       for (j = 0; j < len2; j++) {
         if (s1[i] == s2[j]) {
           break;
         }
       }
       if (j == len2) {  /* s1[i] is not found in s2 */
         *result = s1[i]; 
         result++; /* assuming your result array is long enough */
       }
    }
    

    但是C版本有多少优化? 我们在Delphi版本中做了很多关于实现的决定,我没有想到。 字符串是如何实现的? 在Delphi中,我没有看到它。 在C中,我已经决定它将是一个指向一个ASCII整数数组的指针,我们称之为字符。 在C中,我们一次测试一个角色存在。 在Delphi中,我使用Pos。

    这只是一个小例子。 在一个大型的程序中,C程序员必须用几行代码做出这些低级别的决定。 它增加了一个手工制作的手动优化可执行文件。

    链接地址: http://www.djcxy.com/p/73283.html

    上一篇: Why is C so fast, and why aren't other languages as fast or faster?

    下一篇: What do linkers do?