MATLAB コードをデバッグした後、可能であればアサーションをオフにして速度を少し上げたいと考えています。(アサーション内の式は非常に短くて速いですが、タイトなループ内に多くの呼び出しがあるため、合計されます。はい、プロファイリングしました。) MATLAB でグローバルに行うにはどうすればよいですか? NDEBUG
C/C++ での定義、Python での最適化の有効化、または-disableassertions
Java でのフラグに似たものを探しています。での検索/置換は、私の好みassert(
では醜すぎます。%assert(
1 に答える
これらのソリューションを投稿した後、アサーションを効果的に無効にしながら、式の実行を妨げないことがわかりました。おそらく、論理式 ( ) の短絡を利用して、 のtrue || expr
評価を避けることができますexpr
。global NDEBUG
これは、その代わりにを使用することで実行できますtrue
。つまり、 is のときに評価されないように使用しassert(NDEBUG || expr)
ます。例えば、expr
NDEBUG
true
% parentCode.m (or typed on command prompt)
global NDEBUG; NDEBUG=true;
testassertions % test script below
% testassertions.m
global NDEBUG
if isempty(NDEBUG), NDEBUG=false; end
assert(NDEBUG || fprintf('NO\n')==2) % did fprintf write 3 characters? (no, 4)
disp('Assertions are off!')
assert
このアプローチを使用するには、明らかに、このアプローチを使用するように呼び出しを変更する必要があり、上記で行ったよう(NDEBUG || expr)
に、 を取り込む 2 行を追加します。これはあなたが探している「スイッチ」ではありませんが、ここでの本当の目標と思われる計算を回避します。global
testassertions.m
expr
カスタムでオーバーライドassert.m
パスの先頭assert
で独自のものでオーバーライドできます。使用するだけで機能します:assert.m
varargin
function assert(varargin)
end
初めてそれを実行するかrehash
、パスを実行すると、警告が表示されますが、問題ありません!
>> assert(false)
>> assert(false,'No error here',[])
>>
エラーも警告もありません。
匿名でオーバーライドassert
assert
おそらく管理が簡単なのは、変数の入力と出力のない無名関数です。
assert = @(varargin) deal;
ここではdeal
、入力なしで ( nargin=0
) を使用していvarargout = varargin;
ます。