全て、
誰かが時間行列とデータテーブルについて同様のトレイルを行ったことがあるかどうか疑問に思います。
Clear Log(); Clear Globals(); Close All(DataTables,"No Save");
// Inputs
a = 7;
// Approach 1
TimerStart_1 = Tick Seconds();
dt1 = New Table("Approach-1","Invisible");
dt1 << New Column("Random-1",Numeric,Continuous,<< Set Values(Random Index(10^8,10^a)))
<< New Column("Random-2",Numeric,Continuous,<< Set Values(Random Index(10^8,10^a)))
<< New Column("Add",Numeric,Continuous,Formula(:Name("Random-1")+:Name("Random-2")))
<< New Column("Subtract",Numeric,Continuous,Formula(:Name("Random-1")-:Name("Random-2")))
<< New Column("Multiply",Numeric,Continuous,Formula(:Name("Random-1")*:Name("Random-2")))
<< New Column("Mod",Numeric,Continuous,Formula(Mod(:Name("Random-1"),:Name("Random-2"))));
TimerEnd_1 = Tick Seconds();
Show(TimerEnd_1 - TimerStart_1);
Close All(DataTables,"No Save");
// Approach 2
TimerStart_2 = Tick Seconds();
Mat_1 = Random Index(10^8,10^a);
Mat_2 = Random Index(10^8,10^a);
Add = Mat_1 + Mat_2 ;
Difference = Mat_1 - Mat_2 ;
Prod =E Mult (Mat_1,Mat_2);
Mod = Mod(Mat_1,Mat_2);
TimerEnd_2 = Tick Seconds();
Show(TimerEnd_2 - TimerStart_2);


データ テーブルをプライベートにすると、さらに時間が短縮される可能性がありますが、一般的に、これは公平ですか、それとも速度だけを目的として、あるデータ コンテナを別のデータ コンテナよりも優先する人がいますか?
質問が 2 つあります。これは公平ですか?そしてあなたはどちらかを優先しますか?
フェアに関しては、メモリ管理はすべて言語プロバイダーに任されています。テーブルには行列よりも多くのメソッドがあることに注意してください。最初の質問は、「100 万から 1,000 万の間でのパフォーマンスの変化は予想されますか?」と表現するところだったでしょう。 また、100 万行を超えると、JMP はストレージの圧縮、つまりメモリの節約を行っているのではないかと推測していますが、その代わりに時間がかかります。
私が何を好むかは仕事によって異なります。 メソッドが何度も適用され、概要のパフォーマンスが得られるシミュレーションを行っている場合は、行列を使用します。より優れたサブテーブル参照を備えた JMP 13 より前は、大規模なテーブルがある場合、行列を操作してから、特にパフォーマンスのためにテーブルに値を設定していました。一度もない大きなテーブルには数式を使用します。
JMP 13 サブテーブル参照構文を使用する 3 番目のメソッドをスクリプトに追加するスクリプトを添付しました。 以下のスニペットは、列の追加の構文です。 [このサイトでは添付ファイルの投稿が許可されていないため、最後まで行って埋め込みスクリプトを確認してください。]
dt1[0, "Add"] = dt1[0,"Random-1"]+ dt1[0,"Random-2"] ;
パフォーマンスに興味があるので、これを試してみてください。
a=5;
tb1 = TickSeconds();
Mat_1 = Random Index(10^8,10^a);
te1 = TickSeconds();
tb2 = TickSeconds();
Mat_2 = Round (J(10^a, 1, Random Uniform(10^8) )*10^8,0);
te2 = TickSeconds();
show(te1-tb1, te2-tb2);
a<7 の場合、2 番目の方法は方法 1 よりもはるかに優れています。
a = 6: te1 - tb1 = 2.43333333334886; te2 - tb2 = 0.25; // 2番目のメソッドより優れています
a = 7: te1 - tb1 = 2.48333333339542; te2 - tb2 = 2.56666666665114; //どちらのメソッドも同じです
a = 8: te1 - tb1 = 3.03333333344199; te2 - tb2 = 25.8166666666511; //2 番目の方法はさらに悪い
そして、あなたと同じように、大きな違いがある場合には、参考までに JMP にメモを送ります。
スクリプトを実行している人は、すべてのテーブルなどが閉じられることに注意してください。JMP の新しいセッションで実行してください。
Clear Log(); Clear Globals(); Close All(DataTables,"No Save");
// Inputs
a = 7;
// Approach 1
TimerStart_1 = Tick Seconds();
dt1 = New Table("Approach-1","Invisible");
dt1 << New Column("Random-1",Numeric,Continuous,<< Set Values(Random Index(10^8,10^a)))
<< New Column("Random-2",Numeric,Continuous,<< Set Values(Random Index(10^8,10^a)))
<< New Column("Add",Numeric,Continuous,Formula(:Name("Random-1")+:Name("Random-2")))
<< New Column("Subtract",Numeric,Continuous,Formula(:Name("Random-1")-:Name("Random-2")))
<< New Column("Multiply",Numeric,Continuous,Formula(:Name("Random-1")*:Name("Random-2")))
<< New Column("Mod",Numeric,Continuous,Formula(Mod(:Name("Random-1"),:Name("Random-2"))));
TimerEnd_1 = Tick Seconds();
Show(TimerEnd_1 - TimerStart_1);
Close All(DataTables,"No Save");
// Approach 2
TimerStart_2 = Tick Seconds();
Mat_1 = Random Index(10^8,10^a);
Mat_2 = Random Index(10^8,10^a);
Add = Mat_1 + Mat_2 ;
Difference = Mat_1 - Mat_2 ;
Prod =E Mult (Mat_1,Mat_2);
Mod = Mod(Mat_1,Mat_2);
TimerEnd_2 = Tick Seconds();
Show(TimerEnd_2 - TimerStart_2);
// Approach 3
TimerStart_3 = Tick Seconds();
dt1 = New Table("Approach-3","Invisible", add rows(10^a),
New Column("Random-1",Numeric,Continuous ),
New Column("Random-2",Numeric,Continuous ),
New Column("Add",Numeric,Continuous ),
New Column("Subtract",Numeric,Continuous ),
New Column("Multiply",Numeric,Continuous ),
New Column("Mod",Numeric,Continuous)
);
// Column(dt1, "Random-1") << Set Values( Random Index(10^8,10^a) );
// Column(dt1, "Random-2") << Set Values( Random Index(10^8,10^a) );
// Column(dt1, "Add") << Set Values( dt1[0,"Random-1"]+ dt1[0,"Random-2"] );
// Column(dt1, "Subtract") << Set Values( dt1[0,"Random-1"]- dt1[0,"Random-2"] );
// Column(dt1, "Multiply") << Set Values( dt1[0,"Random-1"]:* dt1[0,"Random-2"] );
// Column(dt1, "Mod") << Set Values( Mod(dt1[0,"Random-1"], dt1[0,"Random-2"]) );
dt1[0,"Random-1"] = Random Index(10^8,10^a) ;
dt1[0,"Random-2"] = Random Index(10^8,10^a) ;
dt1[0, "Add"] = dt1[0,"Random-1"]+ dt1[0,"Random-2"] ;
dt1[0, "Subtract"] = dt1[0,"Random-1"]- dt1[0,"Random-2"] ;
dt1[0, "Multiply"] = dt1[0,"Random-1"]:* dt1[0,"Random-2"] ;
dt1[0, "Mod"] = Mod(dt1[0,"Random-1"], dt1[0,"Random-2"] );
TimerEnd_3 = Tick Seconds();
Show(TimerEnd_3 - TimerStart_3);
Close All(DataTables,"No Save");