みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
ああ、#25ので再現できました。
#22で通過してしまってたのは、While内でフィールドを参照せずにその前に別のステップでローカル変数$textに入れてた(#7のスクリプトでやってるような)からでした。(100万文字の場合にフィールド値でなくスクリプトで生成してたので、その流れ)
While変数の初期化でしかフィールドを参照してないように書いているわけですが、そこが別のローカル変数なのかフィールドなのかで違いが出るようです。
単なる推測ですが、
text = recursive::a1 ;
この場合、textがフィールド値へのポインタか何かになって、そこのアクセスが効率が落ちるんでしょうかね...
(フィールドはタイプが固定されてるが、変数はそうではないから、構造が違う可能性がある)
別のステップで代入しないでも、Whileの中の変数をローカル変数に変えるだけでも、速くなりました。
2か所変更
$text = recursive::a1 ;
result = Left ( $text ; i ) ;
新規の回答に気付かず申し訳ありません。
一部をローカルに変更して
SetRecursion (
While (
[
$text = recursive::a1 ;
i = 1;
result= ""
] ;
i < Length ( $text )+1 ;
[
result = result & Middle ( $text ; i ; 1) & " " ;
i = i + 1
] ;
Left ( result ;i*2-3)
);
Length ( recursive::a1 ))
文字数 処理時間(単位ミリ秒)
100000:3032
300000:45680
500000:172229
1000000:1177144
試験回数が各一回のため正確性に欠ける(また問題の変異点の場合5回平均しても大きい方が速い結果になりPCの状態によって正確性に欠ける状況であったので割愛)が参考のため記させていただきます。
今回の問題はもしかして
「フィールドに 262145 文字以上の下位 ASCII 文字 (256 KB のデータに相当) が含まれる場合、フィールドからグローバル変数を設定する問題が見つかりました。」
https://community.claris.com/en/s/quest … kb-of-data
にも関係が?
FM13v2で修正された問題ですね。
数字は似てますが261245以上なので1文字違ってますし、今回はグローバル変数は使ってないし計算結果の問題ではないので、あまり直接的には関係ないかな。
FM内部のメモリが512KBのものを使ってるらしい点は、関係あるともいえるかな?
この計算式の結果は、またよくわかりませんね。こっちのテストでは
12800:159
51200:1060
102400:3238
204800:10096
262143:26955
262144:27156
30万:411281
261244ちょうどのところは特に「段差」にはなってません、が204800までは2倍あたり3倍ぐらいだったのが262143は1.3倍なのに2.6倍とその間で既に遅くなってるように見えます。30万のところは1桁増えてます。
resultもローカル変数にしてみても変わらないようでした。
i < Length ( $text )+1 ;
が無駄かな?初期化変数に入れると
30万:245831
かなり縮んでるがまだ1桁多い
[ Generated in 0.008 seconds, 7 queries executed - Memory usage: 512.42 KiB (Peak: 519.21 KiB) ]