mojavy.com http://mojavy.com/blog Tue, 21 Apr 2015 01:10:40 GMT Blogofile hourly 1 組み込み用プログラミング言語のパフォーマンス比較 http://mojavy.com/blog/2015/04/21/embedded-languages-benchmarks/ Tue, 21 Apr 2015 01:10:40 JST <![CDATA[v8]]> <![CDATA[lua]]> <![CDATA[lisp]]> <![CDATA[programming]]> <![CDATA[ruby]]> http://mojavy.com/blog/2015/04/21/embedded-languages-benchmarks/ 組み込み用プログラミング言語のパフォーマンス比較 <![CDATA[

組み込み用のプログラミング言語といえばLuaがよく使われるけど、最近はmrubyやsquirrelもあって選択肢が広がってきた感があるのでどういう特徴があるのかを知るためにベンチマークをやってみた。

今回対象にしたのは以下。

  • Lua - v5.1
  • LuaJIT - v2.0.2
  • squirrel - v3.0.7
  • V8 - v3.30
  • mruby - v1.1.0
  • ecl (Embeddable Common-Lisp) - v15.3.7

ここでのベンチマークは言語自体のスピードの比較ではなく、どちらかというと組み込む際に必要なオーバーヘッドやホスト言語側での処理にかかる部分に重点を置いた。

ベンチマークの処理では、関数呼出し比較用のecho関数と、テーブル操作比較用のinvert関数を組み込み言語側に実装して、それを繰り返し呼び出すようにした。

また、なるべく公平になるように、組み込み言語側の関数は初期化時にグローバルスコープ(組み込み言語側のグローバルスコープ)に登録しておき、すべて同じインターフェースから呼ぶようにした。

使用したコードは以下。そのうち別の言語とか追加するかもしれない。

https://github.com/taksatou/embench

結果

echo 100000 回実行

echo

invert 100000 回実行

invert

https://gist.github.com/taksatou/8de85bbfe79548864cf5#file-result-md

備考

  • control は同等の処理をホスト言語側で実装したもの
  • LuaJITはLD_PRELOADで切り替えた
  • eclはechoが遅くてやるきを失ったのでinvertのほうは省略

所感

  • Luaがパフォーマンスと組み込みやすさの点でやはり一番使いやすい。LuaJITをつかうとさらに数割速くなる。
  • squirrelは言語機能的にはluaのスーパーセットという感じで、パフォーマンスもluaと同じ程度。ただしドキュメントはあまりない。
  • V8はマルチスレッド環境や大規模なものには向いてるかもしれない。組み込みはちょっとめんどくさい。
  • mrubyはechoだと意外と健闘しているがテーブル操作は速くない。組み込みはLuaと同じくらい簡単。
  • eclにはもうちょっとがんばってほしい。組み込み方法に問題があるのかもしれない。
]]>
The P Convention http://mojavy.com/blog/2013/02/24/the-p-convention/ Sun, 24 Feb 2013 14:42:00 JST <![CDATA[lisp]]> <![CDATA[programming]]> http://mojavy.com/blog/2013/02/24/the-p-convention/ The P Convention <![CDATA[

lisp

Lispには'p'という接尾辞がつく名前の関数があるが、この'p'はpredicateのこと。

The -P Convention

ところが、HaskellやOCamlにも'p'という接尾辞がつく関数があって、そちらはprimeの意味で使うらしい。 シングルクオート(ダッシュ)記号は英語だとprimeというので、例えばfoo'という名前の関数はfooという名前のヘルパー関数的なもの、ということになる。

“foop”: a naming convention? It's a helper recursive function for “foo”; what does the suffix “p” mean?

ちなみに、OCamlだとシングルクオートが識別子につかえるのでfoo'という名前の関数も結構あるらしい。

まぎらわしい、かと思ったけど使う文脈が違うし意外とそうでもないか。

]]>