アフィリエイト広告を利用しています
G-QVESCNWRVH

2024年05月11日

悩みぬいたこと・・・顧客システムの改修で

●なぜこんなに遅い?

お客様から、要望を頂いてプログラムソースを分析する前
動作させてみて現状を確認
すると・・・・たった一か月の資料を出すためにかなり時間がかかる

詳しくは、前のブログを参照してください一回目の結果を捨てる理由
そこで、どんなデータベースのアクセスをしているのか?
内部ロジックは何なのか?
それを重点的に調べました。すると

一つ目は前回のブログでお話しした通り、【データベースのベタ読み】
これは、これで愚の極みなんですが・・・(プロレベルでは)

しかし、もう一つが、理解不能なロジック
この難解なロジックをずーーーっと見ていても
このコーディングをしたSEの意図が理解できない
●あれっ? 僕ってバカ?

もしかして、僕ってベテランSEと思っていたのに実はバカ?
そう自虐的に思えるほどさっぱりわからない
そのコードはこうなんです
20240510 難解なロジック-01.jpg
これは、RPG4 固定形式の記法なので分かりにくいと思うので
RPG4 フリー形式に書き換えたのがこちら
20240510 難解なロジック-02.jpg

これよりかは VBAの記法で書いたらこう
20240510 難解なロジック-03.jpg

どうです?
めちゃくちゃ意味不明でしょ
●プロのコードの意味が

これが、ソフトウェアハウスが書いたコードなんです
つまりお金をもらってプログラムを作るプロフェッショナルが書いたコード
これに意味がないなんて思えないですよね

でも、どう考えても理解できません

つまりこんな感じです
私が生物でありコンクリートを食べないか、もしくは私が生物でなくコンクリートを食べないならば
<処理するんだー>
って事なんですね

これって、処理する条件には、私が生物であろうがなかろうがコンクリートを食べなきゃいいんだってことになろうかと・・・

なんで、わざわざ、私が生物であるかどうかを条件に組み込んでいるのか・・・・
不思議で仕方がありませんでした
●理解と落胆

そして、いろいろ論理式での展開や、ベン図(ご存じ?)での検証とかを行い、たどり着いた結論
作ったやつがへぼ過ぎる
良くこんなコードを顧客に納品して恥ずかしくないもんだね

例えて言えば、例えて言えば・・・・たとえて言えば・・・・


例えられなーい! 酷すぎて
結局、コンクリートを食べないならばだけにしてプログラムを書き換えたところ
印刷出力した結果は全く同じ
しかも、速度は、前回お話しした通り

プロの仕事は、大阪から東京まで最速で移動したい顧客に対して
新幹線や飛行機をお勧めせず、各駅停車の在来線で乗り継いでいったら最速ですよー
って感じの納品をしている

そんなの納品されて黙っていられますか?(笑)
まぁ、そのプロのソフトウェアハウスを紹介したのが、当社だってことを聞いているので
口が裂けてもお客様にそんな事はばらせませんが・・・・

(多分、私のブログの読者にはお客様は居ないと・・・
居たとしても、まさか自分の事だと気付かないと・・・信じたい(笑))



人気ブログランキング
人気ブログランキング



一回目の結果を捨てる理由

新幹線.jpg

●処理時間の計測

IBM AS/400でのプログラムやプロシージャなどの動作について
記憶装置は全て主記憶(Windowsでは主記憶の一部にページング用メモリ)をシミュレート
つまりCPUからは、全てのOS・プログラム・データベースなどは主記憶にあるように見える

当然、AS/400にもHDDやSSDは存在する
それらは、主記憶の一部を構成する
(えっ?それって遅いんじゃない?)そんな声が聞こえてきそう(笑)

でも、そのように見せるため仕組みが・・・賢い(笑)
もちろん、主記憶全部がメモリであるわけはない

最近では、補助記憶部分の全てをSSDで構成することも行われているが
SSDと言えども主記憶メモリの速度に比べたらかたつむり

なので、主記憶のうちメモリ部分とHDDやSSDとの間のデータ転送は必要
これはページングとかメモリスワッピングとか呼ばれる
●1回目は遅いはず

なので、あるプログラムを起動すると
1回目から早い場合もあり、遅い場合もある
主記憶のうち、メモリ上にある場合は早く、HDDやSSD上に有れば遅い

それはWindowsでも同じ
ただ・・・・
IBM i というOSがメモリ管理しているわけではない
●2回目以降が早い理由

IBM i というOSが全てのジョブ、全てのプロセスを管理しているため
主記憶のメモリ上に読み込んでこなければならないオブジェクト(プログラム、データベースなどもろもろ)を全て知っており
全てのジョブがどのデータベースを使用しているかを把握

効率よいページングを行っている

いろいろなジョブで良く使われるプロシージャとかデータベースは
恐らくいつもメモリ上に存在しているから2回目以降は極端に早くなる

また、データベース機能が素敵ドキドキしているハートだから
インデックスを張った場合、必要なレコードだけがメモリ上に展開されたりと
プログラムが最高に早く動作できる環境を提供してくれている
●そのまた理由

そして、冒頭に話したページング・・・これを
IBM AS/400ではハードウェアで行っている
CPUがしているわけではない

なので、CPUはブログラムを実行するだけ
その実行に必要な全てのオブジェクトはハードウェアが用意してくれる
このため、めちゃ早になる
●余談

前職での話
グループ他社が前職のシステムをWindowsベースで開発すると・・・
どうやら親会社が自分とこのシステムを前職の会社に導入させようとした
そこで、要件定義をするとき、処理時間も加えた

これからが大変だった
処理速度が3分以上のプログラムを探すというとんでもない業務が降りかかってきた

2週間ぐらい探しまくったが、見つからなかった
プログラム本数は3,000本ほど

仕方なく、オーディエンスを行った(笑)
現場の方に、遅い処理に何があるか聞いてみた

結果、1個のプログラムが候補に挙がった
それで試してみると、結果がでるまで3分19秒
(これで細工(サイク=319)は流々と思ったので覚えてる(笑))

ところが、2回目以降に時間が短縮される事を思い出し
同じプログラムをもう一度起動してみた・・・・

悲しいことに3秒程度で終わってしまった
と、いうことで3分以上時間がかかる処理は
・夜間バッチ(これはWindows化対象外)
全報告書印刷出力ジョブなので30分はかかる
・請求明細作成(これもWindowsか対象外)
全顧客の一か月分の請求明細を作成するため3分半はかかる
のみ(笑)

どんだけ早いねん!と思ってた



人気ブログランキング
人気ブログランキング



タグ:爆速
posted by Y.Taki@AS400 at 10:00| Comment(0) | TrackBack(0) | AS/400

悩んだ挙句・・・高速化に成功

12万円の損失.jpg

●プロの仕事?

お客様のシステムプログラムの改修が必要となった
どうやら、大した改修でもなさそう

売り上げた月に請求せず、次月請求となる販売があり
その場合に印刷された日付が請求日となっているが
これは売上日でなければならないというもの

つまりプログラムの中で、請求日を印刷している部分を
売上日にすればいいと・・・・
そして、データベースには両方とも存在し、ソース中には両方ともある

しめしめにこにこ
これは、とても簡単! フィールド名を1か所変えればOk
と、言う事でフィールド名を変更し、コンパイル

いざ、テストだ!
まずは変更前のプログラムで実行してみる
●あれっ?

なんだか、結果を得るための時間がえらく長い
高々30万レコードから目的の1か月分を処理するのに30秒以上
1秒に1万レコードしか処理できないって・・・

爆遅〜〜〜
IBM AS/400でこれほど遅いのは見たことがない
って言うか、前職で数億レコードから1か月分の1500万レコード
これを処理する請求明細作成処理で4分弱だったことを覚えている

4分として計算しても、6万/秒程度の処理速度
しかも、請求額を計算する時にそれの数十倍のマスターアクセスもしていた
それに比べると・・・・
●そりゃそうだろう

どうしてこんなプログラム構造にしているのか・・・・
RPGサイクルを使用したいがために、系の処理速度を著しく落としている
処理速度低下の原因の一つが・・・べた読み

ありえへん! プロの仕事じゃない!
いやいや、アマでもこれほどいい加減なコーディングはしない

まぁ、開発当初は1秒程度で済んでたんだろう(笑)
しかし、レコード数の増大を考えにいれていないのは素人さん

そこで、改修要件には入っていないが、改修しちゃった(笑)
あくまで、テストのため、毎回30秒も待たされるのは地獄の苦痛

文書化も含めて、変更にかかった時間は・・・約10分
いざ、テスト(笑)
IBM AS/400のプログラム処理速度を測定する時は
1回目を捨てて、2回目以降の3回の処理時間を計測 (何故かは次回に!

一回目:31秒
二回目:31秒
三回目:31秒
あれっ? ちなみに、ゼロ回目・・・本来捨てるはずの計測結果も31秒
納得の結果になった(笑) どれだけ無駄な動作をしてるんだろう
●高速化の為に行ったこと

データベースにインデックスを張っただけ
(AS/400的に言うと論理ファイルを作成しただけ)
そして、プログラムで元のデータベースの名前を論理ファイルの名前に変更しただけ

これだけなら1分だけど、残りの9分は・・・
悩んだーーー
何で悩んだかは、次々回に(笑) (これでブログネタが増えた顔1(うれしいカオ)

高速化の結果
一回目:1秒未満(笑)
二回目:1秒未満
三回目:やっぱり1秒未満

なぜ1秒未満かというと、スマホのストップウォッチで測ったけど
スタートのためのタップを左手人差し指でやったから、正確に測定できなかったΣ( ̄ロ ̄lll)ガーン
だって、プログラムを起動させたら、すぐに終了していたから

もちろん、テストをした結果は全く同じ印刷結果が得られたことは言う間でもない
(請求日のところは売上日にはなっていたけどねウインク
●結論

プロと言えど、ヘタレはいる
なんと言えば良いのか分からない

原因が分かった時には空いた口が塞がらず、気分転換しなければ
改修業務をそのまま継続できなかった(笑)

まさかデータベースのべた読みなんて(笑)
AS400の機能性能を無視してこんな作り方をするから

でも、まあAS400だから30秒程度で済んでたのかも(笑)
このお客様のシステムにより
お客様の被った不利益は・・・時間的損失は・・・

1回当たり30秒だけど、このプログラムに限った事ではない
これに類することを1日50回するとして、
1日当たり1500秒 =25分
1か月あたり     ≒10時間
1年あたり      ≒120時間

時給1000円(安っ!)で換算すると 12万円

このヘタレのおかげで毎年12万円の損失を与えていたことになる

ちなみに・・・タイトルの悩んだのは次々回に述べる事であるので念のため(笑)






人気ブログランキング
人気ブログランキング



" allowfullscreen>
ファン
検索
<< 2024年05月 >>
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
最新記事
写真ギャラリー
最新コメント
タグクラウド
カテゴリーアーカイブ
プロフィール
Y.Taki@AS400さんの画像
Y.Taki@AS400
IBM AS/400で稼働するシステムの開発・追加を担当して30年以上になります。使えば使うほどこの AS/400 が好きになりました。 こんなSEがいろいろな視点から様々な業務などについて語ります。
プロフィール