Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

配列のサイズ、次元数が大きい程、個々の配列関連処理に時間が掛かる。 #187

Open
DIYJii opened this issue Jul 5, 2024 · 3 comments
Assignees
Labels
bug Something isn't working

Comments

@DIYJii
Copy link

DIYJii commented Jul 5, 2024

概要

例えば、単純に配列に数字を書き込むだけの処理でも、配列が大きく成れば成る程、1回当たりの処理時間が増える。
1次元配列より、2次元配列の方が配列サイズ増加に伴う回数当たり処理時間の増加の程度は激しく、幾何級数的に増加する。
(注:配列が大きければ、其れ全体を処理するのに時間が掛かるのは当然だが、ここでは個々の式の処理に時間が掛る様になるという事を意味している。)
配列から要素をGetする場合もほぼ同じ結果なので、配列へのアクセスに時間が掛っているように見える。

ちなみに、UWSCでは回数当たり処理時間は、1次元配列より2次元配列の方で多少の増加は有るが、配列のサイズには関係なくほぼ処理時間は一定している。

本件は、UWSCで1秒以内に終わっていたワンクリック・オペがUWSCRに移行後 5~6秒掛かる様に成った事に端を発しています。色々調べた結果200~300回 ForでLoopするコードの中に180*6サイズの2次元配列を毎回10回位ずつアクセスしている事が主たる原因であることが判明しました。

という事で、改善策を模索する意味でも必要となる為、思い切ってベンチマーク用のスクリプトを書きました。
当方の古くて遅いPCで走らせたベンチマークの結果も含めて、そのプログラム、及びマニュアル等々を送りますので、詳細については、そちらを参照下さい。

なお、一時的な解決策として、CSV又はTSVファイルを配列代わりに使えば、UWSCにほぼ匹敵するパフォーマンスが得られる事が判り、それ関連の関数も作りましたので送ります。疑似配列の宣言、SetClear,Get,Put,Addの機能を含みます。

BenchMark.txt
BMTestOrg.txt
BMTestCase.txt
BMResultO.txt
BMTestCaseP.txt
BMResultP.txt
ベンチマーク・マニュアル.txt
Functions.txt

再現スクリプト

以下のファイルを送ります。.uwsは.txtに替えて送ります。

BenchMark.uws      メイン・プログラム UWSC上でRun
BMTestOrg.uws      メイン・プログラムよって、ここにTestCaseを埋め込んだテスト・プログラムBMTest.uwsが生成される
BMTestCase.txt   1次配列、2次配列のサイズを変えて書き込み時間を計測するケース
BMResultO.txt   上記ケースのテスト結果のレポート

BMTestCaseP.txt  TSVファイルによる疑似配列のテスト・ケース(上記配列テストと同じ処理をテスト)
BMResultP.txt      疑似配列のテスト結果。

ベンチマーク・マニュアル.txt

Functions.txt   TSVファイルを使った疑似配列用の関数 

再現手順

上記ファイルをUWSCR.exe, UWSC.exeと同じPathに置き、BenchMark.uwsの2行目にある
  PUBLIC Path = "C:\Users\Public\Documents"
を、必要に応じて該当Pathに合わせて書き換えた後、BenchMark.uwsをUWSC上で起動すると、 そちらのPCでBMTestCase.txtを使って実際に計測したレポートが 作成されます。
又、BMTestCaseP.txtを、BMTestCase.txtとReNameするか、又はBMTestCaseP.txtを開いて全体をクリップボードにコピーした後にBenchMark.uwsを起動すると、疑似配列のテスト結果が出ます。

BMTestCase.txtを自分で書いてテストする事も出来ますので、マニュアルを一読 下さい。 

バージョン

1.0.1

不具合発生環境

Windows 10

@DIYJii DIYJii added the bug Something isn't working label Jul 5, 2024
@DIYJii
Copy link
Author

DIYJii commented Jul 9, 2024

BMTestCaseP.txt
BMTestCaseP.txtの 疑似2次元配列に関するスクリプトに問題が有りましたので、訂正したファイルを送ります。
PROCEDURE PM_Initialize()中の"<#TAB>"はBenchMark.uwsで使う場合はCHR(9)に替えるべきであった事と、

TestCase:のFPUT中((a-1) Mod 10)は((a-1) Mod 10) + 1)であるべきでした。その為、変な内容のファイルが出来上がっていました。なお、この変更による処理時間計測結果には殆ど変化は有りません。

ところで、今日、初めて「UWSCRの配列について」(2023年12月05日付け)という記事を見付けたのですが、UWSCに比べて、利便性向上の面で大分尽力されたのですね。私の使い方では、配列リテラルのようにダイナミックに配列をいじるような事はないのですが、他の変数に代入出来る事等は便利さを感じています。
それなのに、今回ケチを付けるようなことを事を、問題にして申し訳ないです。本件はその利便性向上の為の内部構造の変化の結果なのではないかと察します。ソースコードに対する影響範囲も大きそうですし、取り敢えずは現行通りで, 回避方法としてTSVファイルのパフォーマンスを紹介しておくのも良いのではないでしょうか?
なお、必要なら、Functions.txtにある、私が使っている疑似配列関数にエラー・チェックを入れるなど、もう少し一般的な使用に耐えるスクリプトに仕上げる事も、やぶさかではありません。

@stuncloud
Copy link
Owner

@DIYJii

配列の処理に関しては実装が明らかに悪く、それがパフォーマンスに影響しているものと推測されます
改善予定自体は以前からあったものの改善方法については検討中であり、まあ時間があるときにやりましょう…ということで後回しになっていました
とはいえ本件で問題が表面化したこともあり配列の実装改善タスクの優先度を上げることにしました
これはバージョン1.1.0を目標とします

回避方法としてTSVファイルのパフォーマンスを紹介しておくのも良いのではないでしょうか?

配列のパフォーマンスに問題を感じた方はおそらくこのissueにたどり着くでしょうから、ここで参照できる形になっていれば十分だと思います

僕自身がバグissueを上げる際は現象の回避手段や代替コードがあればそれも併記するようにしています
Issue自体もドキュメンテーションとして機能しますから、それを参照することでトラブルシューティング的に利用できると後から同じ問題に直面した方にとっては便利になりますよね

@DIYJii
Copy link
Author

DIYJii commented Jul 10, 2024 via email

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

2 participants