我有一个小型轻量级应用程序,可用作更大解决方案的一部分。目前它是用C语言编写的,但我希望使用跨平台脚本语言重写它。该解决方案需要在Windows,Linux,Solaris,AIX和HP-UX上运行。
现有的C应用程序运行正常,但我想拥有一个可以为所有平台维护的脚本。与此同时,我不想失去很多表现,但我愿意失去一些。
脚本的启动成本非常重要。可以在每秒每分钟到多次的任何地方调用此脚本。因此,保持低内存和启动时间非常重要。
所以基本上我正在寻找最好的脚本语言:
可能的选择包括但不限于:bash / ksh + curl,Perl,Python和Ruby。对于这种情况,您会推荐什么?
答案 0 :(得分:22)
Lua是一种符合您标准的脚本语言。它肯定是现有的最快和最低内存脚本语言。
答案 1 :(得分:8)
由于您需要快速启动时间和大于1Hz的呼叫频率,我建议您继续使用C并确定如何使其便携(并不总是像一些ifdef一样简单)或探索转向的可能性它成为一个始终运行的服务守护进程。当然这取决于如何
如果编译模块并运行.pyc文件,Python可以降低启动时间,但通常认为它很慢。 Perl,根据我的经验,使用最快的脚本语言,所以你可能会对perl守护进程好运。
您还可以查看gtk,wxWidgets和Qt等跨平台框架。虽然他们的目标是GUI,但他们确实拥有低级别的跨平台数据类型和网络库,可以更轻松地使用基于C的快速应用程序。
答案 2 :(得分:6)
“每分钟调用一次到每秒一次。因此,保持内存和启动时间很低很重要。”
这对我来说听起来不像是一个剧本。
这听起来像服务器处理从每分钟到几秒钟到达的请求。
如果它是服务器,处理请求,启动时间并不像响应性那么多。在这种情况下,Python可能运行良好,并且仍能保持性能提升。
您只是处理另一个请求,而不是重新启动。您可以保持尽可能多的状态来优化性能。
答案 3 :(得分:5)
如果写得正确,C应该是平台无关的,只需要重新编译那些不同的平台。您可能必须跳过标题的#ifdef箍(并非所有系统都使用相同的标头),但大多数正常(非win32 API)调用都非常便携。 对于Web访问(我认为你需要提到bash + curl时),你可以看一下libcurl,它可以用于你提到的所有平台,并且不应该那么难用。
考虑到执行时间和内存成本,我怀疑你可以比使用任何脚本语言编写正确的C更快,因为你至少会花一些时间来解释脚本......
答案 4 :(得分:4)
我同意Lua:它是超级可移植的,它有XML库,无论是本机还是通过绑定C库如Expat,它有一个很好的套接字库(LuaSocket)加上,对于复杂的东西,一些cURL绑定,并且众所周知,它非常轻便(通常嵌入在低内存设备中),速度非常快(最快的脚本语言之一),而且功能强大。并且很容易编码!
它是用纯Ansi C编写的,很多人声称它有一个最好的C biding API(从Lua调用C例程,从C调用Lua代码......)。
答案 5 :(得分:3)
如果低内存和低启动时间真的很重要,你可能会考虑做一些工作来保持C代码跨平台,但我发现这很少是必要的。
就我个人而言,我会使用Ruby或Python来完成这类工作,它们都可以很容易地制作出其他人可以维护的清晰可理解的代码(或者你可以在不查看它6个月后维护它)。如果您有控制权,我建议您获取最新版本的解释器,因为Ruby和Python最近都在性能方面取得了显着进步。
这有点像个人的事情。编程Ruby让我感到高兴,C代码没有(也没有为任何重要的事情编写脚本)。
答案 6 :(得分:2)
Python很好。我还会查看计算机语言基准游戏网站:
http://shootout.alioth.debian.org/
理解基准测试可能需要花费一些时间(包括启动时间和内存使用数量)。比较了许多语言,如Perl,Python,Lua和Ruby。您还可以将这些语言与C中的基准进行比较。
答案 7 :(得分:2)
正如其他人所建议的,守护你的脚本可能是一个好主意;这会将启动时间减少到几乎为零。要么有一个小的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;'。)
答案 8 :(得分:0)
我同意其他人的意见,你应该尝试将它变成一个更便携的C应用程序,而不是将其移植到其他东西,因为任何脚本语言都会从启动角度引入大量开销,拥有更大的内存占用,可能会慢很多。
根据我的经验,Python是三者中效率最高的,其次是Perl,然后是Ruby,Perl和Ruby之间的区别在某些方面特别大。如果您真的想尝试将其移植到脚本语言中,我会用您最熟悉的语言编写原型并查看它是否接近您的要求。如果您没有偏好,请从Python开始,因为它易于学习和使用,如果使用Python太慢,Perl和Ruby可能无法做得更好。
答案 9 :(得分:0)
请记住,如果您选择Python,如果性能不佳,您也可以在C中扩展它。哎呀,你甚至可以使用你现在拥有的一些代码。只需重新编译它并使用pyrex包装它。
你也可以在Ruby和Perl中相当容易地做到这一点(虽然有些困难)。不要问我如何做到这一点。
答案 10 :(得分:0)
你可以让它成为一个长期运行的过程并回答http或rpc请求吗? 这几乎可以满足任何情况下的延迟要求,但我不知道这是否会破坏您的内存占用限制。
答案 11 :(得分:0)
你有一个已经在工作的应用程序。显然,您想要调用几个来源提供的功能。它看起来像是对我的服务描述(可能更容易维护)。
最后,您还提到这是更大解决方案的一部分,然后您可能希望重用较大解决方案的语言和设施。从您给出的描述(xml + http)来看,它似乎是一个非常常见的应用程序,可以用任何通用语言编写(也许是java中的Web容器?)。
更多细节可能会引发更多想法:)
答案 12 :(得分:0)
将您的应用移植到Ruby。如果您的应用程序太慢,请对其进行分析并在C中重写这些部分。