3

文字列引数を返すだけの次の関数があります。

function N_(s)
  return s
end

この関数名はgettextからわかるかもしれません。これは、.pot エクストラクタのみの利益のためのマーキングです。

C または Lua で N_() を実装する方が効率的でしょうか?

経験則を教えていただけますか?

別の質問:

もう少し複雑な関数があるとしましょう:

function Z_(s)
  return dict[s] or s
end

C または Lua で Z_() を実装する方が効率的でしょうか?

(C コードからではなく、Lua コードから N_() と Z_() の両方を呼び出します。)

4

2 に答える 2

5

この場合の違いは測定していませんが、Lua で書いた方が速いと思います。C 関数の呼び出しは、多少コストがかかります。

経験則として、ライブラリ C 関数が存在する長いタスクでない限り、すべて Lua で記述します。

おそらく、C コードよりも Lua コードを作成する方がはるかに生産的であることに注意してください。そのため、Lua の方が早く解決できる可能性があります。性能はおそらく十分でしょう。

いずれの場合も、YMMV などで自分で測定してください。

于 2013-12-25T13:00:39.673 に答える
2

ほとんどの時間を Lua で費やしている場合、Lua で実装されたプロセッサ集約型の関数は、C で実装された関数よりも効率的である可能性が非常に高くなります。これは、将来的にLuaJITを使用することになった場合に特に当てはまります。コンパイラは、関数が言語内にある場合、それが何も知らないあいまいな C 関数である場合よりも、関数から常により多くの情報を推測することができ、さまざまなコンテキストを飛び回る必要はありません。

Cで実装する際の問題は、Lua が既にそのような機能を備えている C でZ_実装する必要があることです。dictしたがって、特別に最適化されたハッシュマップが必要かどうかによって異なりますが、おそらく C の方が優れているでしょう。


関数呼び出しの効率が気になる場合は、結果をキャッシュするだけではどうですか?

-- instead of doing:
print(Z_('Hello world! My name is %1!', 'Lua'))
-- perhaps do this:
local greeting = Z_('Hello world! My name is %1!', 'Lua')
print(greeting)
-- reuse greeting at some later time.

もちろん、あなたの関数はまだZ_置換を必要としていないように見えますが、後でそうなるかもしれないと思います。ただし、置換がまったく必要ない場合は、次のような表にすることもできます。

local Z = setmetatable({}, {__index = function(t,k) return k end})
Z['greetings'] = 'Hello world!'
print(Z['greetings']) -- Hello world!
print(Z['goodbye']) -- goodbye

このテーブルには、__indexテーブルにそのようなエントリがない場合、使用されたキーを返すメタメソッドがあります。

于 2013-12-25T13:18:35.527 に答える