【问题标题】:Performance Comparison of Shell Scripts vs high level interpreted langs (C#/Java/etc.)Shell 脚本与高级解释语言(C#/Java/等)的性能比较
【发布时间】:2011-05-28 08:58:59
【问题描述】:

首先 - 这并不是要成为一个“更好的、无知的非离子战争线程”……而是,我通常需要帮助来做出架构决策/论证以提交给我的老板。

跳过细节 - 我只是想知道并找到任何对 Shell 与 [在此处插入通用编程语言(解释)进行了一些性能比较的人的结果,例如 C# 或 Java...

令人惊讶的是,我在 Google 上花了一些时间在这里搜索,却没有找到任何这些数据。有没有人在不同的用例中做过这些比较?像在 XYX 循环中一样命中数据库,执行不同类型的 SQL(Oracle 首选项,但 MSSQL 会执行)查询,例如任何 CRUD 操作 - 也没有命中数据库,只是常规 50k 循环类型比较执行不同类型的计算,以及那种性质的东西?

特别是 - 现在,我需要比较从 shell 脚本访问 Oracle DB 与 C#(同样,任何解释的 GPPL 都可以,即使是更高级别的,如 Python)。但我还需要了解标准编程计算/指令/等...

在你问‘为什么不自己写一个快速测试?答案是:我的一生/职业生涯都是一名 Windows 开发人员,并且对 Shell 脚本的了解非常有限——更不用说整个 *nix.... 所以在这里提出更多问题有经验的人会非常受益,更不用说节省时间了,因为我们正处于接近永久的最后期限紧缩状态;)。

【问题讨论】:

  • C# 和 Java 不被解释。
  • 我认为更好的问题是“为什么这对你很重要?”您显然有一个用例,如果我们知道它是什么,那么我们可以提供更多帮助。
  • Shell 和编程语言有非常不同的用途,而且您通常无法在两者中表达相同的东西。这就像将 Emacs Lisp 与 .Net 进行比较。您提到了 SQL 查询,但 shell 没有任何方法可以做到这一点。它会为此调用一些外部程序。
  • @cdhowie,实际上较旧的 JVM 只是简单地解释了 java 字节码,这往往更慢。所以,从这个意义上说,Java 是“被解释的”。
  • @Chris - 用例是业务询问我们'当我们在您的应用程序上按下此按钮时(瘦客户端 .NET WinForms 应用程序与运行 .ksh 脚本的 *nix 服务器通信)需要 40 分钟运行 - 我们希望它降低到 5 分钟。是的,我知道如何处理业务以及管理期望。叹息,我只想问一个问题并在没有“更多详细信息”的情况下得到答案,因为我为我的 Q 提供了很多 - 其他一切都无关紧要(是的,我知道如何处理业务祛痰,是的,我知道什么是分析器是的,是的,我知道 CLR 和 JVM 是如何工作的……

标签: c# java performance shell interpreted-language


【解决方案1】:

如果您正在编写代码并且担心处理速度,那么您应该编写直接编译为汇编或为现代 VM 编译的代码。

但是...随着摩尔定律每 18 个月提高一次处理能力,我想知道:性能要求真的有必要吗?即使是解释代码在大多数现代系统上运行速度也非常快,而且随着时间的推移它只会变得更好。您真的需要编译后的代码可以为您带来的那种速度提升吗?

如果答案是否定的,那就写下任何让你开心的东西。

【讨论】:

  • 感谢乔恩的回复。呵呵,我的问题实际上源于业务的 single 要求,要求我们对 .NET WinForms 客户端应用程序进行更改。改变?制作一个经常被按下的按钮“从需要 40 分钟到 5 分钟”。 WinForm 应用程序实际上并没有做任何事情,而是将 req 发送到 *nix 服务器,该服务器在 shell 脚本中进行实际处理。我已经签署了保密协议,所以我无法真正了解任何细节,但希望这会有所帮助。非常感谢。
  • 仅供参考 - 这只是我在上面向 Chris 描述的更大系统的一小部分 - 只是想象一下 WinForms 客户端有一大堆选项卡和按钮以及充满参数和所有类型的下拉菜单这种性质的事情,大部分工作都是在 shell 脚本服务器中完成的......
  • @dferraro :每 5 分钟而不是每 40 分钟按下一个按钮,实际上应该不会对处理产生太大影响。除非此按钮在客户端启动一个需要超过 5 分钟才能完成的方法,否则它应该不会产生太大的影响。如果确实需要更长的时间,我建议使用多线程来提供帮助。
  • @Alex - “制作一个经常被按下的按钮”而不是“每 5 分钟而不是每 40 分钟按下一个按钮”。处理“需要 40 分钟”,但客户希望处理只需要“5 分钟”。
  • @dferraro:这是一个完全不同的问题。我会抽出测试工具并找出处理瓶颈所在。一旦你发现你可以开始优化工作。更改语言可能无济于事——事实上,增加的复杂性可能会使事情变得更糟。 (一个想法 - 是否涉及 SQL?我经常发现数据库是许多瓶颈的根源......)
【解决方案2】:

这高度依赖于脚本在做什么。我已经看到写得很糟糕的 shell 脚本通过 simple 的变化而加速了一个、两个甚至三个数量级。

通常,shell 脚本只是一些胶合逻辑,用于运行通常编译为 C 或 C++ 的实用程序。如果是这种情况,可能没有太多可以做的事情来加快速度。如果繁重的工作是由一个编写得很糟糕但编译好的实用程序完成的,那么它只是在非常快地做很多浪费的努力。

也就是说,Python 或 Perl 将比 shell 脚本快得多,但 VM 或本机代码会更快。

由于您无法告诉我们任何细节,我们无法真正提供具体的帮助。

如果您想看一个简单的演示进行比较,请尝试我的pure-Bash implementation of hexdump并与实物进行比较:

$ time ./bash-hexdump /bin/bash > /dev/null
real    7m17.577s
user    7m2.570s
sys     0m14.745s
$ time hexdump -C /bin/bash > /dev/null
real    0m2.459s
user    0m2.260s
sys     0m0.176s

Bash 版本慢的主要原因之一是它逐个字符地读取文件,这是处理空字节所必需的(shell 不太擅长处理二进制数据),但主要原因是执行。以下是a Python script I found 的示例:

$ time ./hexdump.py /bin/bash > /dev/null
real    0m11.694s
user    0m11.605s
sys     0m0.040s

【讨论】:

    【解决方案3】:

    虽然这不包括“Shell”(又名 sh/bash/ksh/powerscript)语言,但它是一个相对较大的“语言 [实现] 性能”列表——充满了一般性和注意事项。无论如何,有人可能会喜欢它。

    http://benchmarksgame.alioth.debian.org/

    【讨论】:

      【解决方案4】:

      如上所述,您将无法从 shell 执行 SQL 查询。由于 VM 因素,在 VM 上运行的语言需要一点时间,否则差异应该可以忽略不计。

      如果问题真的是将它从 40 分钟减少到 5 分钟,我会尝试找出哪个部分占用了大部分时间。如果查询运行时间最长,那么切换语言对您没有多大帮助。

      同样(问题中没有太多细节)我将从查看系统的不同组件开始,看看哪个是瓶颈。

      【讨论】:

        【解决方案5】:

        曾几何时,《伟大的计算机语言大战》确实包含一些 shell 脚本。

        所以,感谢Internet Archive, from 2004 -

        注意shell脚本没有用于许多测试的程序。

            Score Missing-Tests
        
        Java 20     1
        
        Perl 16     0
        
        Python 16   0
        
        gawk 12     6 
        
        mawk 10     6 
        
        bash 7      12  
        

        注意 shell 脚本有时可以小而快 :-)

        "Reverse a file"

                CPU (sec)   Mem (KB)    Lines Code
        
        bash    0.0670      1464        1
        
        C gcc   0.0810    4064        59
        
        Python  0.3869    13160       6
        

        【讨论】:

        • 不过,这并不能真正衡量“bash 的速度”;-) Ways to reverse a file in Linux -- 很好地找到了存档。
        • @pst - 如果 OP 可以使用这种技术来解决他的问题,我认为他不会关心是否有人认为它“不是真正测量“bash 的速度” '。
        • 谢谢,这就是我一直在寻找的,某种无用的哑循环和时间差异(或其中有很多比较的链接)。我为什么需要的实际细节和更大的图景太多了,以至于无法写出任何人都会真正关心/阅读的内容
        • 枪战中为什么没有组装?
        • @Pacerier -- “因为我知道这需要比我选择捐赠更多的时间。Been there; done that.
        【解决方案6】:

        我只是很想知道并且 找到任何人的结果 做了一些性能比较 的……

        这种比较的持久教训是特定细节很重要。

        不仅是任务的具体细节,而且(我们作为程序员不应该知道这一点)shell 脚本是如何编写的具体细节。

        那么,你能找到了解那种 shell 语言并能检查 shell 脚本是否以有效方式编写的人吗? (如果将几行代码从 40 分钟缩短到 5 分钟,那不是很好。)

        【讨论】:

          【解决方案7】:

          刚刚在我的系统上做了这个非常简单的基准测试,结果符合预期。

          将 1 到 50,000 之间的所有整数相加并在每一步输出答案

          猛击:3 秒 C:0.5秒

          【讨论】:

            猜你喜欢
            • 2012-10-16
            • 2011-01-18
            • 1970-01-01
            • 2010-11-09
            • 1970-01-01
            • 2011-11-09
            • 2020-12-10
            • 2015-01-10
            • 1970-01-01
            相关资源
            最近更新 更多