ループ処理のネストを減らす方法

#ループ処理

#whileループ

#forループ


 ループ処理を行う場合気を使って書かないとならないと言う事が有ります。

 ループ処理で、ネストをすると、ネストさせる度に極端に処理速度が低下すると言う処理速度の低下問題が発生するのです。

 

ループ処理の中に一個ネストさせたループ処理が有る場合をダブルループと称する事とします。

また、ダブルループの中に再度ネストさせたループが有る場合をトリプルループと称する事にします。

また、トリプルループの処理の中に更にネストされたループ処理が有る場合をフォースループと呼ぶ事にします。



【ループ処理が必要になる理由】

 そもそも、ループ処理を行わせる場合、何故、ループ処理をしなければならなくなるかと言う事を説明します。

 解っている事だとは思いますが、ループ処理は、データの数が多い為、一個の関数や一個の変数では処理を完了する事が出来ないから、データの数分の回数ループ処理を行うと言うのがループ処理です。


【ループ処理を減らす方法の簡単な説明】

〔ループ処理が必要になる理由〕で説明しました様な理由でループ処理が必要になります。

従って、ループ処理は、処理するデータ数分の関数と変数が有ればループを完全に無くす事が出来る事になります。



【ダブルループの場合】

 ダブルループ程度なら、処理速度の低下は少なめです。それでも、処理速度が著しく低下しています。本当に早いプログラムを書くには、シングルループ以外は使わないと言うのが最も良いコーディングだと言えます。

 とは言っても、ダブルループをシングルループにする事は、殆どの場合できないと思われます。なので、ダブルループをシングルループにする方法は、無いと思って良い程です。


でも、最初のループ処理をネストされたループ処理よりも大きなループにする事で、ダブルループで処理させる時間を短縮する事が出来ます。


【トリプルループの場合】

 トリプルループの場合は、分解してダブルループ二回に処理を分けた方が速いのです。

〔ループ処理を減らす方法の簡単な説明〕で説明した方法でループ処理を分解するのが一番良い方法です。

 

 当社では、今現在、INDEXソートと言うソフトウエアを開発しています。このソフトウエアを開発するにあたって、日本語及ローマ字対応を行う必要がありました。

 どしても、260字程度までの日本語及ローマ字対応が必要になったのです。この為、ループ処理を大変多く使用する事になりました。

 そこで、当社開発販売中の「千人力」を使用してループ処理を減らすと言うプログラミングしております。


 8byteずつに文字を分割して処理を行う関数を作成して処理させています。データに対して専用の関数は、33個必要になりました。その為、既に、1万3000行に達しました。完成予想では、2万行に達するかもしれませんが、それでも、処理速度優先で開発しております。

 日本語及ローマ字対応させる場合、21億文字に対応するわけにも行かないので、Windowsのファイル名の最大長の260字に対応しようと言う事で開発しております。

 実際のユーザーがINDEXソートソフトを使用してソートする文字列の長さは、不明です。5文字であったり、100文字であったり、全ての行の文字数が同じ場合もあるし、まちまちの文字数の行である場合もあると考えられます。

 その為、最初にソートする文字の量を計算すると言う処理が有ります。本来、ここで、ループをネストして記述するものですが、ネストせずに、結果の処理する文字数をゲットして一度、ループ処理を抜けて関数を終了させます。

 次に、switch文を使用して、ソートする文字の量に対応した関数呼び出し処理を作成します。

 関数には、連続番号を付して作成しますので、当社の「千人力」を使用してswitch文を作成する前に、case文の中の関数の呼び出し文を記述させます。

 caseによって、呼び出し関数の数が違ってきますが、「千人力」の仕様でそのような記述が出来ないので、図1の様に記述して全ての呼び出し文を作成させます。半角カタカナの「ア」の部分が連番に書きかられます。

 全ての呼び出し文を使って、呼び出し用の関数を作る為のSwich文を作成する「千人力」の操作画面のコピーです。

 以下の図は、すべて最大値と最小値を取得する為の処理の画面です。INDEXソートの関数は秘密にさせていただきます。


図1


図2


 図2でプログラムコードを作成して、コンパイラに完成プログラムを貼り付けます。

 以下の図3の様な状態になる様に、出来上がったプログラムで要らない部分を丹念に削除します。

 図3は、コンパイラに、出来上がったSwich文を貼り付けて、要らない部分を削除した状態の画面です。

 少々、手間が必要になります。当社の「千人力」の仕様の為、どうする事も出来ません。申し訳ございません。


図3


 次に、処理する文字数分の関数を大量に記述させます。関数の中には、当然、使用する変数が有ります。この変数も違う名前にして専用に使えるようにします。もちろん、関数名には、連続番号を付します。

 当社の「千人力」を使用します。半角カタカナの「ア」の部分が連番に書き換えられます。

 図5は、出来上がった関数をコンパイラに貼り付けた画面です。33個の関数を作って貼り付けました。


図4


図5


 そうして、最後に、全て処理結果を一つの配列に代入すると言う処理を行わせる事で、完全にループ処理を一個減らす事に成功し、処理速度の向上に成功しております。

 当社での開発は、MFC C++です。MFC C++では、メンバ関数と言うものが有ります。

 ヘッダーファイルに、関数のプロトタイプを記述して関数を登録しないと使えないのですが、このプロトタイプも当社の「千人力」に自動で書かせる事でプログラミングしております。

 図6は、INDEXソート関数のプロトタイプを記述させる為の「千人力」の操作画面です。半角カタカナの「ア」の部分が連番に書き換えられます。


図6


図7


 作成した関数のプロトタイプを所定の場所に貼り付けると言う簡単な作業で済ませております。

 図7は、コンパイラに貼り付けた、プロトタイプの関数です。


【フォースループの場合】

 フォースループの場合は、殆どの場合が、ダブルループ二回に分解できるはずです。ダブルループになる様に処理を分割して下さい。


【チュートリアルについて】

 ループ処理のネストを減らす方法は、ケースバイケースです。

 チュートリアルを作成しようかと思いましたが無理なので作成しませんでした。このブログを参考にして下さい。


【結語】

 処理に最大上限が有る場合は、当社の「千人力」を使用してループ処理のネストを完全に一回分減らす事が確実に可能です。

 当社の「千人力」を是非、お買いお求め下ささい。便利ですよ。
閲覧数:12回0件のコメント

最新記事

すべて表示