9

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

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

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

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

  • 跨平台。
  • 能够解析 XML 和 HTTP Posts。
  • 低内存和低启动时间。

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

4

13 回答 13

23

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

于 2008-11-29T21:38:22.413 回答
8

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

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

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

于 2008-11-29T22:01:23.663 回答
6

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

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

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

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

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

于 2008-11-29T22:55:09.357 回答
5

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

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

于 2008-11-29T21:48:55.293 回答
4

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

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

于 2008-11-29T22:46:09.687 回答
3

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

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

这是一个有点私人的事情。Ruby 编程让我很开心,而 C 代码却没有(也没有 bash 脚本编写任何重要的东西)。

于 2008-11-29T21:59:35.350 回答
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;'。)

于 2008-11-29T23:15:50.737 回答
2

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

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

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

于 2008-11-29T22:12:41.877 回答
0

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

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

于 2008-11-29T22:09:35.970 回答
0

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

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

于 2008-11-29T22:24:05.053 回答
0

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

于 2008-11-29T22:58:24.203 回答
0

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

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

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

一些库可以帮助您使代码可移植: BoostQt

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

于 2008-11-30T00:02:51.263 回答
0

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

于 2008-11-30T06:18:51.817 回答