速度を求めているので、Mathematica モジュールをコンパイルしたいと考えています。
testC = Compile[{{inputInt, _Integer}},
Module[{outputInt, bitShift = 5},
outputInt = BitShiftRight[inputInt, bitShift]
]
, CompilationTarget -> "C", RuntimeOptions -> "Speed"
, CompilationOptions -> {"ExpressionOptimization" -> True,
"InlineCompiledFunctions" -> True,
"InlineExternalDefinitions" -> True}
];
私の実際の関数はもっと長いですが、非常に単純な構造を持ち、リストを使用し、Total、Table、BitAnd、If の関数のみを含んでいます。すべてのコンパイルおよびランタイム オプションは、この 1 行の抽出ではなく、実際の関数で (おそらく) 役立ちます。
設定しました
SetSystemOptions["CompileOptions" -> "CompileReportExternal" -> True];
何が起こるか確認できるように
CompilePrint[testC]
次の結果が得られます
1 argument
3 Integer registers
Underflow checking off
Overflow checking off
Integer overflow checking off
RuntimeAttributes -> {}
I0 = A1
I1 = 5
Result = I2
1 I2 = MainEvaluate[ Hold[BitShiftRight][ I0, I1]]
2 Return
このスレッドhttps://mathematica.stackexchange.com/a/1101/1403から期待/恐れられているように、BitShiftRight はコンパイル可能ではなく、MainEvaluate へのこの呼び出しは私の機能に深刻な影響を与えます。BitAnd、BitNot、BitOr、BitXor が . (速い)回避策を知っている人はいますか?C 言語関数への MathLink 呼び出しを使用できますが、私の目的は、この関数を Manipulate[ ] で使用し、スタンドアロンの cdf ファイルとして展開することです。そして、このコンテキストでは MathLink を使用できないことを理解していますよね? ところで、扱いやすい回避策はありますか?