第13回 プログラム性能問題

photo-1473259990169-f6e6a8477bb7

プログラムパフォーマンスの話

今回はプログラムのパフォーマンスに関しての話を紹介したいと思います。ここ最近、プログラムの処理速度が遅いからどうにかしてほしいという依頼があります。製品の仕様で最初だけ遅い、処理しているサーバーリソースが足りず遅い、プログラムが遅い等ありましたがここではプログラムに関して紹介します。大量データの処理等ありがちなものは結局のところ工夫していくしかないので今回はありがちな話題で。

1.ファイル入出力に関して

基本的に大量データの処理や外部との通信システム等のプログラム以外で処理が遅いとなるとファイル入出力だと思います。ファイル入出力は巨大データでも、バッファ処理を行うため比較的高速ですが、使い方を間違えるとかなりパフォーマンスに影響が出ます。

例えば以下のようなファイルを作成する場合を考えて見ます。

dn: cn=tanat,ou=tecsup,dc=tailwind,dc=co,dc=jp
changetype: modify
replace: description
description: DB admin user

replace: enumber
enumber: 182

dn: cn=nagat,ou=tecsup,dc=tailwind,dc=co,dc=jp
以下省略

実際にあったのですが、ファイル入力に対し一行一行ファイルに書き出しているプログラムがありました。こんな感じのプログラムをループしてる感じだったと思います。(間に色々処理は挟みますが)

#入力データに対して特定の形式でデータを出力する(プログラムは所々省略)
Get-Content $IN_FILE | Foreach-Object{
"dn: cn=" + $CN + ",ou=" + $OU + "dc=tailwind,dc=co,dc=jp" | Out-File $LDIF_FILE -encoding Default -append
"changetype: modify" | Out-File $LDIF_FILE -encoding Default -append
"replace:" + "description" | Out-File $LDIF_FILE -encoding Default -append
"description: DB admin user" | Out-File $LDIF_FILE -encoding Default -append
"-" | Out-File $LDIF_FILE -encoding Default -append
#以下省略


}

これだけの書き込みを大量な入力データに対して頻繁に行うと問題になってきます。配列を用意して変数に格納してから出力するほうが良いでしょう。

$LDIF_BUF = @(1..$DATA_LENGTH)
Get-Content $IN_FILE | Foreach-Object{
$CNT++
$LDIF_BUF[$CNT] = "dn: cn=" + $CN + ",ou=" + $OU + "dc=tailwind,dc=co,dc=jp`n"
$LDIF_BUF[$CNT] += "changetype: modify`n"
$LDIF_BUF[$CNT] = "replace:" + "description`n"
$LDIF_BUF[$CNT] += "-`n"
#以下省略


}
$LDIF_BUF | Out-File $LDIF_FILE -encoding Default -append

自分の経験としてはexcelマクロを作っていたときに同じようなことがありました。すべてのプログラミング環境に対して共通でいえることだと思います。実際、今回のような内容は私の知る限り多くの入門書には書かれていないため、初心者が陥りがちな問題だと思い取り上げました。当時の担当者と話したところ、kshellからpowershellへ移植の際、ロジックをそのまま書き写したことが原因とのことでした。

仮想化セキュリティの決定版 CS-TWiSt

Page Top

Copyright © 2017 (株)テイルウィンドシステム All rights Reserved.