全部,
想知道是否有人對時間矩陣與數據表進行了類似的跟踪。
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);


將數據表設為私有,可能會節省更多時間,但總的來說,這是公平的,還是有人僅僅為了速度而更喜歡一個數據容器?
@gzmorgan0 ,
感謝您的詳細回复。 您的解釋大部分是準確的,我希望我一開始就提供更清晰的解釋。 我同意並分享你對數據表和矩陣的偏好,如果我需要更多內置方法而不是矩陣,我會使用數據表。 然而,我想讓社區思考的問題是處理大數據的速度,以及行為是否會隨著數據量的增加而改變,以及為什麼會改變。 我想相信這是因為您所指的存儲壓縮。
一個有趣的方面是通過數據表子腳本節省的時間。 在 a = 7 時,它比傳統的列公式方法縮短了 7 秒——矩陣在性能方面仍然領先。
你有兩個問題:這公平嗎?你喜歡一個嗎?
公平地說,內存管理完全取決於語言提供者。請記住,表格比矩陣有更多的方法。我會將您的第一個問題表述為,“這種性能變化是否在預期的 100 萬到 1000 萬之間?” 此外,我只是猜測在 100 萬行之後,JMP 可能會進行一些存儲壓縮,換句話說,節省內存,代價是時間。
我喜歡什麼取決於任務。 如果我正在進行模擬,其中一種方法被多次應用並且我獲得了匯總性能,那麼我將使用矩陣。在具有更好的子表引用的 JMP 13 之前,如果我有大表,我會使用矩陣,然後將值專門設置到表中以提高性能,我會絕不對大表使用公式。
我附上了一個腳本,該腳本將第三種方法附加到您的腳本中,該方法使用 JMP 13 子表引用語法。 下面的代碼片段是添加列的語法。 [本站不讓發附件,到最後看填充腳本。]
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,第二種方法遠優於方法1。
a = 6: te1 - tb1 = 2.43333333334886; te2 - tb2 = 0.25; //第二種方法更優
a = 7: te1 - tb1 = 2.48333333339542; te2 - tb2 = 2.56666666665114; //兩種方法一樣
a = 8: te1 - tb1 = 3.03333333344199; te2 - tb2 = 25.8166666666511; //第二種方法更糟糕
和你一樣,當有很大差異時,我會向 JMP 發送一張便條作為 FYI。
對於運行腳本的人,請注意它會關閉所有表等。在 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");