「
利用者:Sukemaru
」を編集中 (節単位)
ナビゲーションに移動
検索に移動
警告:
ログインしていません。編集を行うと、あなたの IP アドレスが公開されます。
ログイン
または
アカウントを作成
すれば、あなたの編集はその利用者名とともに表示されるほか、さまざまなメリットもあります。
スパム攻撃防止用のチェックです。 決して、ここには、値の入力は
しない
でください!
=== 関数の「呼び出しコスト」 === ユーザー関数は、呼び出し元から参照可能な位置に記述すれば、ソースコードの任意の位置に配置することができる。 繰り返し何度も呼び出して使用する関数の場合に「呼び出しコスト」を気にする人もいるらしいが、Mery で使用するマクロ程度のソースコードであればあまり気にする必要はないようにおもわれる。 '''e.g. [[#メタ記号をエスケープする|半角英数字以外を「¥」でエスケープ処理する]]''' ※ あえて '''ループ処理で1行ずつエスケープ''' してみる ([[#その他、拙作マクロについて|@ロースペの XP ノート]]) <syntaxhighlight lang="javascript"> /* 関数バージョン */ function Quote( str ) { return str.replace( /\W/g, "\\$&" ); } // または // var Quote = function( str ) { // return str.replace( /\W/g, "\\$&" ); // } BeginUndoGroup(); var lines = document.GetLines( 0 ); for ( var i = 1, st, a = []; i <= lines; i ++ ) { st = Quote( document.GetLine( i, 0 ) ); a.push( st ); } document.Text = a.join( "\n" ); </syntaxhighlight> <syntaxhighlight lang="javascript" inline>function Quote( str )</syntaxhighlight> でも <syntaxhighlight lang="javascript" inline>var Quote = function( str )</syntaxhighlight> でも、約 9500 行の日本語テキスト(約 33 万文字)にたいして 1.1 秒台の処理時間がかかり有意な差はみられなかった。 関数を使用しない以下のようなベタ書きのコードの場合でも、ほぼ同じ程度の処理時間がかかった (@ロースペの XP ノート)。 <syntaxhighlight lang="javascript"> /* 非関数バージョン */ BeginUndoGroup(); var lines = document.GetLines( 0 ); for ( var i = 1, st, a = []; i <= lines; i ++ ) { st = document.GetLine( i, 0 ).replace( /\W/g, "\\$&" ); a.push( st ); } document.Text = a.join( "\n" ); </syntaxhighlight> ※ ループ文の中で関数を定義した場合は、やや遅くなって 1.3 秒台。 <syntaxhighlight lang="javascript"> BeginUndoGroup(); var lines = document.GetLines( 0 ); for ( var i = 1, st, a = []; i <= lines; i ++ ) { function Quote( str ) { return str.replace( /\W/g, "\\$&" ); } st = Quote( document.GetLine( i, 0 ) ); a.push( st ); } document.Text = a.join( "\n" ); </syntaxhighlight> ※ 行ごとのループ処理ではなく、文書全体の '''一括処理''' にすると速くなる。 上とおなじ <code>Quote()</code> 関数を使用しての文書全体の一括処理でも… <syntaxhighlight lang="javascript"> function Quote( str ) { return str.replace( /\W/g, "\\$&" ); } document.Text = Quote( document.Text ); </syntaxhighlight> 関数を使用しないベタ書きの一括処理でも… <syntaxhighlight lang="javascript"> document.Text = document.Text.replace( /\W/g, "\\$&" ); </syntaxhighlight> …処理時間はほぼ同じで、約 0.7 ~ 0.8 秒だった。 現行 OS の [https://ja.wikipedia.org/wiki/Chakra#%E6%AD%B4%E5%8F%B2 Chakra エンジン (jscript9.dll) であれば約 20 倍] の速度が出るらしいので、数メガバイトとか数万行とかのよほど長大な文書の処理をする場合でもなければ、「関数の呼び出しコスト」を気にする必要はあまりなさそう。 それよりも、 * 文字列操作や検索/置換にさいして、なるべくキャレットの移動をともなうメソッドを使用しない : ※ できるだけ Mery 独自のメソッドよりも、代替可能な JavaScript の [https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String#Methods_2 String オブジェクトのメソッド] を変数内で使用する (Mery のマクロメソッドは「キー操作の記録と再生が一番の目的」なので、動作速度的に最適化されていないのかも)。 * くりかえし何度も参照されるオブジェクトやプロパティは変数に格納する : e.g. [[マクロリファレンス:Document インターフェイス#Text プロパティ|Document.Text]] や [[マクロリファレンス:Selection インターフェイス#Text プロパティ|Document.Selection.Text]]、 [https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/length#Iterating_over_an_array for 文 での Array.length] など。 * 関数定義文で必要となる引数をすべて与えておき、関数スコープからグローバルスコープに変数の値を参照しに行かないで済むようにしておく * ループ処理などから繰りかえして呼び出す必要のある関数の場合は、なるべくなら関数定義文を呼び出し元のコードよりも先に記述しておく などで、ソースコードの最適化をはかるほうが良いはず。(… sukemaru 自身はこのルールをあまり守っていない) ※ ちなみに、<code>Quote()</code> 関数を以下のように記述した場合、上のようなループ処理コードでの所要時間は 3 倍(3 秒台)。 <syntaxhighlight lang="javascript"> function Quote( str ) { return str.replace( /\W/g, function( $0 ) { return "\\" + $0; } ); } </syntaxhighlight> 以下のような記述だと、ループ処理した場合の所要時間は 4 倍以上(4 ~ 5 秒台)になる。 <syntaxhighlight lang="javascript"> function Quote( str ) { return str.replace( /\W/g, Escape ); } function Escape( matched ) { return "\\" + matched; } </syntaxhighlight> …ループ処理から参照する関数のネストや二重参照は、ループ文内で関数を定義する場合以上に鬼門のようだ。
編集内容の要約:
MeryWikiへの投稿はすべて、他の投稿者によって編集、変更、除去される場合があります。 自分が書いたものが他の人に容赦なく編集されるのを望まない場合は、ここに投稿しないでください。
また、投稿するのは、自分で書いたものか、パブリック ドメインまたはそれに類するフリーな資料からの複製であることを約束してください(詳細は
MeryWiki:著作権
を参照)。
著作権保護されている作品は、許諾なしに投稿しないでください!
このページを編集するには、下記の数式を計算してその答えを欄に入力してください (
ヘルプ
):
いちたすには =
キャンセル
編集ヘルプ
(新しいウィンドウで開きます)
スポンサーリンク
ナビゲーション メニュー
個人用ツール
ログインしていません
トーク
投稿記録
アカウント作成
ログイン
名前空間
利用者ページ
議論
日本語
表示
閲覧
編集
履歴表示
その他
検索
スポンサーリンク
スポンサーリンク
案内
メインページ
ヘルプ
よくある質問
マクロリファレンス
マクロライブラリ
プラグインライブラリ
構文ファイル
テーマ
寄付・開発支援
練習用ページ
開発室
開発者のブログ
ツール
スポンサーリンク