【问题标题】:Scripting language choice for initial performance [closed]初始性能的脚本语言选择[关闭]
【发布时间】:2010-09-24 14:10:17
【问题描述】:

我有一个小型轻量级应用程序,用作大型解决方案的一部分。目前它是用 C 语言编写的,但我希望使用跨平台脚本语言重写它。该解决方案需要在 Windows、Linux、Solaris、AIX 和 HP-UX 上运行。

现有的 C 应用程序运行良好,但我希望有一个可以为所有平台维护的单一脚本。同时,我不想失去很多表现,但愿意失去一些。

脚本的启动成本非常重要。可以从每分钟到每秒多次调用此脚本。因此,保持其内存和启动时间较短很重要。

所以基本上我正在寻找最好的脚本语言:

  • 跨平台。
  • 能够解析 XML 和 HTTP Posts。
  • 内存不足,启动时间短。

可能的选择包括但不限于:bash/ksh + curl、Perl、Python 和 Ruby。对于这种类型的场景,您会推荐什么?

【问题讨论】:

    标签: python ruby perl bash scripting-language


    【解决方案1】:

    将您的应用移植到 Ruby。如果您的应用程序太慢,请对其进行分析并用 C 重写这些部分。

    【讨论】:

      【解决方案2】:

      乍一看,这听起来像是过度工程,根据经验,我建议仅在出现问题时进行修复。

      您有一个已经在运行的应用程序。显然你想调用从几个来源提供的功能。它看起来像是对我的服务描述(可能更容易维护)。

      最后你还提到这是一个更大的解决方案的一部分,那么你可能想要重用更大的解决方案的语言和设施。从您给出的描述(xml+http)来看,它似乎是一个很常见的应用程序,可以用任何通用语言编写(可能是 java 中的 Web 容器?)。

      一些库可以帮助您使代码可移植: Boost, Qt

      更多细节可能引发更多想法:)

      【讨论】:

        【解决方案3】:

        正如其他人所建议的那样,将您的脚本后台化可能是一个好主意;这会将启动时间减少到几乎为零。要么有一个小的 C 包装器连接到你的守护进程并来回传输请求,要么让守护进程直接处理请求。

        不清楚这是否是为了处理 HTTP 请求;如果是这样,Perl 有一个很好的 HTTP 服务器模块,绑定到几个不同的基于 C 的 XML 解析器,以及超快的字符串支持。 (如果你不想守护进程,它有一个很好的、功能齐全的 CGI 模块;如果你可以完全控制它运行的服务器,你也可以使用 mod_perl 将你的脚本实现为 Apache 处理程序。) Ruby 的字符串有点慢,但有一些非常好的后台工具可用。恐怕我对 Python 不太熟悉,所以我真的无法对此提出任何建议。

        不过,总的来说,我认为您并不像您想象的那样受到启动时间的限制。如果脚本确实每秒被调用多次,那么任何体面的操作系统上的任何体面的解释器都将被缓存在内存中,脚本的源代码及其模块也将被缓存。结果:启动时间不会像您想象的那么糟糕。

        Dagny:~ brent$ time perl -MCGI -e0
        
        real    0m0.610s
        user    0m0.036s
        sys     0m0.022s
        Dagny:~ brent$ time perl -MCGI -e0
        
        real    0m0.026s
        user    0m0.020s
        sys     0m0.006s
        

        (Perl解释器的参数加载相当大的CGI模块,然后执行代码行'0;'。)

        【讨论】:

          【解决方案4】:

          您能否改为让它成为一个长时间运行的进程并回答 http 或 rpc 请求?
          这几乎可以满足任何情况下的延迟要求,但我不知道这是否会破坏您的内存占用限制。

          【讨论】:

            【解决方案5】:

            “从每分钟到每秒多次调用。因此,保持它的内存和启动时间很重要。”

            这对我来说根本不像脚本。

            这听起来像是一个服务器处理从每分钟到每秒几次到达的请求。

            如果是服务器,处理请求,启动时间并不意味着响应能力。在这种情况下,Python 可能运行良好,并且仍然保持性能。

            您只是在处理另一个请求,而不是重新启动。您可以根据需要保持尽可能多的状态以优化性能。

            【讨论】:

            • 对我来说是最明智的回答。定义问题通常比找到答案更难。
            【解决方案6】:

            我同意 Lua:它是超级可移植的,它有 XML 库,无论是原生的还是通过绑定像 Expat 这样的 C 库,它有一个很好的套接字库 (LuaSocket) 加上,对于复杂的东西,一些 cURL 绑定,并且是以非常轻量级(通常嵌入在低内存设备中)、非常快(最快的脚本语言之一)和强大而闻名。而且非常容易编码!

            它是用纯 Ansi C 编码的,很多人声称它拥有最好的 C 语言 API 之一(从 Lua 调用 C 例程,从 C 调用 Lua 代码......)。

            【讨论】:

              【解决方案7】:

              请记住,如果您选择 Python,如果性能不是很好,您也可以在 C 中扩展它。哎呀,您甚至可以使用您现在拥有的一些代码。只需重新编译它并使用pyrex 包装它。

              您也可以在 Ruby 和 Perl 中相当容易地做到这一点(尽管有些困难)。不过不要问我如何做到这一点。

              【讨论】:

                【解决方案8】:

                Python 很好。我还会查看 The Computer Languages Benchmarks Game 网站:

                http://shootout.alioth.debian.org/

                可能值得花一点时间了解基准(包括启动时间和内存使用的数字)。比较了许多语言,例如 Perl、Python、Lua 和 Ruby。您还可以将这些语言与 C 中的基准进行比较。

                【讨论】:

                  【解决方案9】:

                  我同意其他人的观点,您可能应该尝试将其打造为更便携的 C 应用程序,而不是将其移植到其他东西上,因为从启动的角度来看,任何脚本语言都会引入大量开销,并且内存占用要大得多,并且可能会慢得多。

                  根据我的经验,Python 是三者中效率最高的,其次是 Perl,然后是 Ruby,Perl 和 Ruby 在某些方面的差异特别大。如果您真的想尝试将其移植到脚本语言,我会用您最熟悉的语言制作一个原型,看看它是否符合您的要求。如果您没有偏好,请从 Python 开始,因为它易于学习和使用,如果 Python 速度太慢,Perl 和 Ruby 可能无法做得更好。

                  【讨论】:

                    【解决方案10】:

                    由于您需要快速启动时间和大于 1Hz 的调用频率,我建议您继续使用 C 并弄清楚如何使其可移植(并不总是像几个 ifdef 那样简单)或探索转向的可能性它进入一个始终运行的服务守护进程。当然这取决于如何

                    如果您编译模块并运行 .pyc 文件,Python 的启动时间可能会更短,但通常仍认为它很慢。以我的经验,Perl 是最快的脚本语言,所以你可能会在 perl 守护进程中获得好运。

                    您还可以查看 gtk、wxWidgets 和 Qt 等跨平台框架。虽然它们针对的是 GUI,但它们确实具有低级跨平台数据类型和网络库,可以使使用基于 C 的快速应用程序的工作变得更加容易。

                    【讨论】:

                    • 根据我的经验,Perl 的启动时间比 Python 快;它不是更快。所以 python 守护进程可能是一个解决方案。
                    【解决方案11】:

                    如果低内存和低启动时间真的很重要,您可能需要考虑做一些工作以保持 C 代码跨平台,但我发现这很少需要。

                    就我个人而言,我会使用 Ruby 或 Python 来完成这类工作,它们都可以很容易地编写出其他人可以维护的清晰易懂的代码(或者您可以在 6 个月不看它之后维护)。如果您有控制权,我还建议您获取最新版本的解释器,因为 Ruby 和 Python 最近在性能方面都取得了显着改进。

                    这有点私人的事情。 Ruby 编程让我很开心,而 C 代码则不会(也不会为任何重要的事情编写 bash 脚本)。

                    【讨论】:

                      【解决方案12】:

                      如果编写得当,C 应该是独立于平台的,并且只需要针对那些不同的平台重新编译。您可能必须跳过一些#ifdef 箍来获取标头(并非所有系统都使用相同的标头),但大多数普通(非win32 API)调用非常可移植。 对于 Web 访问(我假设您在提到 bash+curl 时需要它),您可以查看 libcurl,它适用于您提到的所有平台,并且应该不难使用。

                      考虑到执行时间和内存成本,我怀疑您是否可以比使用任何脚本语言正确编写 C 更快,因为您至少会浪费一些时间来解释脚本...

                      【讨论】:

                        【解决方案13】:

                        Lua 是一种符合您标准的脚本语言。它无疑是可用的最快和最低内存的脚本语言。

                        【讨论】:

                        • 但是它有需要的库吗??
                        • Lua 是否可以在 AIX 和 HP-UX 上运行?
                        • @Leon,请参阅@PhiLho 关于图书馆的回答。 @mpeters,因为 Lua 是在 ANSI C 中实现的,所以应该在任何有 C 编译器的东西上运行。
                        猜你喜欢
                        • 2011-08-17
                        • 2011-03-12
                        • 2010-11-05
                        • 2010-12-13
                        • 1970-01-01
                        • 2023-03-29
                        • 2011-03-10
                        • 2013-06-19
                        • 2012-10-02
                        相关资源
                        最近更新 更多