文字と文字列の探索

文字、文字列を探すにはCLI命令とCLC命令、複数文字の中から何れかの文字を探すにはTRT命令が利用できます。z/Architectureの今日では、これらのよく知られた命令に加え、SRST命令やTRTE命令、更にはベクトル命令も利用できます。

単一文字の探索

SRST命令による単一文字の探索

CLIのように1バイトずつアドレスをずらしながらループする必要はありません。31ビット・アドレッシング・モードでは領域の最大長は2GBです。領域が余りに長いとCPU判断で命令動作は途中で停止します。この時はCC=3が通知されるので、単純に命令を再実行すれば続きから再探索されます。

ベクトル命令による単一文字の探索

ベクトル命令(SIMD命令)による単一文字の探索例です。1度に16バイト分の領域を同じ文字で比較します。命令の組み合わせ方はとても複雑ですが、単純なCLI命令でのループに比べれば繰り返し数は1/16にできます。SRST命令もかなり効率的ですがそれ以上です。COBOLコンパイラーも最新機種に合わせて文字列処理にベクトル命令を使うような最適化がなされています。

文字列の探索

SRST命令による文字列の探索

SRST命令はSEARCH STRINGですが、実際には1文字の探索です。文字列を探索する場合は、先頭文字で探して見つかったら文字列全体をCLCで比較します。2文字目以降が異なっていたら、探索再開アドレスと残りの領域長をレジスターに設定し直して元のループに戻ります。CLC命令をループさせるより遙かに効率よく探し出せます。

ベクトル命令による文字列の探索

IBM z15以降でサポートされたベクトル拡張機能2で実装されたVSTRS命令による文字列の探索例です。文字列探索の場合も、比較文字列と被比較領域内容をベクトル・レジスターに読み込んで処理が行われます。そのため、探索できる文字列長は最大で16バイトです。16バイトを超える文字列の場合は、先頭の16バイト分をベクトル命令で探索して、一致箇所が見つかったら残りのデータをCLC命令等で比較します。数百バイトを超えるような領域の探索や内容を変えての探索処理を繰り返し行うような場合は、領域の先頭からCLC命令を1バイトずつアドレスをずらしながら実行するよりも効率良く探索できます。

命令の違いによる実行速度の比較

文字探索命令の実行速度比較(IBM z16)
命令 処理速度(CPU時間:単位=秒)
CLI 0.000814
SRST 0.000082
VCEQB 0.000044
1024byte領域内の末尾にある1文字を探索する処理を1024回繰り返したもの。狭い範囲であればCLI命令を使う方法がコーディングも容易で第3者にも分かり易いが、数KBを超えるような領域であればSRST命令が性能面で軍配が上がる。ベクトル命令なら更に処理効率が高まる期待があるがコードの複雑さが難点。SRST命令がコードの書きやすさと性能面でのバランスがよいか。
文字列探索命令(処理)の実行速度比較(IBM z16)ケース1
命令 処理速度(CPU時間:単位=秒)
CLC 0.001885
SRST+CLC 0.000267
VSTRS 0.000233
1024byte領域内のほぼ終端にある16文字を探索する処理を1024回繰り返したもの。途中に先頭文字のみ同じの異なる文字列を50バイト間隔で18箇所配置している。複数文字の比較なのでCLC命令を使う方法がコーディングも容易で第3者にも分かり易いが、1バイトずつアドレスをずらしながらのループなのでそれなりにCPU使用量も増える。数KBを超えるような領域であれば、SRST命令で先頭文字のみを探し、見つかればCLC命令で文字列全体が一致するかを調べる方法が性能面で軍配が上がる。文字列長が16バイト以内ならベクトル命令を使う方法が安定して処理速度が高まるが、コードの複雑さが難点。なお、SRST命令の場合は先頭文字の一致箇所が延々と見つからないような状況ではベクトル命令よりもCPU使用量は少なくなる。
文字列探索命令(処理)の実行速度比較(IBM z16)ケース2
命令 処理速度(CPU時間:単位=秒)
SRST+CLC 0.000154
VSTRS 0.000233
領域サイズと繰り返し数はケース1と同じであるが、途中の先頭文字のみ同じ文字列の配置9箇所に半減させたもの。先頭文字の一致箇所が半減することでSRST命令の実行数も減るためCPU使用量も減っている。先頭文字の一致箇所が延々と見つからないような状況ならCPU使用量は更に減ることになる。文字や文字列の検索処理では検索される記憶域内のどこに一致箇所があるかで処理時間がバラつくが、SRST命令では検索される記憶域内の途中のデータ・パターンによってもCPU使用量が変化する。

複数の単一文字の探索

TRTE命令による256バイトを超える領域の探索

256バイトを超える領域の探索表による探索を1回で行えます。TRT命令では256バイトを超える領域であれば256バイトずつ分割して実行することになりますが、TRTE命令を使えば31ビット・アドレッシング・モードでは領域の最大長は2GBです。TRTE命令もSRST命令同様に領域が余りに長いと命令動作は途中で停止します(CC=3)。TRTE命令は長い領域を探索するだけでなく、引数と機能バイトを2バイトにすることもできます。