9

私は、より大きなソリューションの一部として使用される小さな軽量のアプリケーションを持っています。現在はCで書かれていますが、クロスプラットフォームのスクリプト言語を使って書き直そうと思っています。このソリューションは、Windows、Linux、Solaris、AIX、およびHP-UXで実行する必要があります。

既存のCアプリケーションは正常に動作しますが、すべてのプラットフォームで維持できる単一のスクリプトが必要です。同時に、私は多くのパフォーマンスを失いたくありませんが、いくらか失っても構わないと思っています。

スクリプトの起動コストは非常に重要です。このスクリプトは、毎分から毎秒何回までどこでも呼び出すことができます。結果として、メモリと起動時間を低く保つことが重要です。

したがって、基本的に私は次のような最高のスクリプト言語を探しています。

  • クロスプラットフォーム。
  • XML解析とHTTP投稿が可能です。
  • 低メモリと低起動時間。

可能な選択肢には、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

「毎分から毎秒何度も呼び出されます。結果として、メモリと起動時間を低く保つことが重要です。」

これは私にはまったくスクリプトのようには聞こえません。

これは、サーバーが 1 分ごとから 1 秒に数回到着する要求を処理しているように思えます。

リクエストを処理するサーバーの場合、起動時間は応答性ほど重要ではありません。その場合、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 に同意します。非常に移植性が高く、ネイティブまたは Expat のような C ライブラリをバインドすることによって XML ライブラリがあり、優れたソケット ライブラリ (LuaSocket) に加えて、複雑なもの、いくつかの cURL バインディングがあり、よく知られています。非常に軽量 (低メモリ デバイスに組み込まれることが多い)、非常に高速 (最速のスクリプト言語の 1 つ)、そして強力です。そしてとても簡単にコーディングできます!

これは純粋な Ansi C でコーディングされており、多くの人が最高の C 入札 API の 1 つを持っていると主張しています (Lua から C ルーチンを呼び出す、C から Lua コードを呼び出す...)。

于 2008-11-29T22:46:09.687 に答える
3

他の人が示唆しているように、スクリプトをデーモン化することは良い考えかもしれません。これにより、起動時間が実質的にゼロになります。デーモンに接続してリクエストを送受信する小さなCラッパーを使用するか、デーモンにリクエストを直接処理させます。

これがHTTPリクエストを処理することを目的としているかどうかは明らかではありません。もしそうなら、Perlは優れたHTTPサーバーモジュール、いくつかの異なるCベースのXMLパーサーへのバインディング、そして超高速の文字列サポートを備えています。(デーモン化したくない場合は、フル機能の優れたCGIモジュールがあります。実行しているサーバーを完全に制御できる場合は、mod_perlを使用してスクリプトをApacheハンドラーとして実装することもできます。)Rubyの文字列少し遅いですが、それに利用できるいくつかの本当に良いバックグラウンドツールがあります。私はPythonにあまり詳しくないので、恐れているので、Pythonについて実際に推奨することはできません。

ただし、一般的に、あなたが思っているほど起動時間に制約があるとは思いません。スクリプトが実際に1秒間に数回呼び出されている場合、適切なオペレーティングシステム上の適切なインタプリタは、スクリプトとそのモジュールのソースコードと同様に、メモリにキャッシュされます。結果:起動時間は思ったほど悪くはありません。

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 に答える
3

低メモリと低起動時間が本当に重要な場合は、Cコードのクロスプラットフォームを維持するための作業を検討することをお勧めしますが、これが必要になることはめったにありません。

個人的には、このタイプの仕事にRubyまたはPythonを使用します。どちらも、他の人が保守できる(または、6か月間見なかった後に保守できる)明確で理解しやすいコードを作成するのが非常に簡単です。あなたがそうするためのコントロールを持っているなら、私はまた、RubyとPythonの両方が最近パフォーマンスに関して顕著な改善をしたので、インタプリタの最新バージョンを入手することを提案します。

少し個人的なことです。Rubyをプログラミングすることは私を幸せにしますが、Cコードはそうではありません(重要なことについてはbashスクリプトもありません)。

于 2008-11-29T21:59:35.350 に答える
2

Pythonは良いです。また、The Computer LanguagesBenchmarksGameのWebサイトもチェックします。

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

ベンチマーク(起動時間とメモリ使用量の数値を含む)を理解するために少し時間を費やす価値があるかもしれません。Perl、Python、Lua、Rubyなどの多くの言語が比較されます。これらの言語をCのベンチマークと比較することもできます。

于 2008-11-29T22:12:41.877 に答える
0

スクリプト言語はスタートアップの観点からかなりのオーバーヘッドをもたらし、はるかに大きなメモリフットプリントを持ち、おそらくはるかに遅いです。

私の経験では、Pythonが3つのうちで最も効率的であり、次に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 に答える