Re: [問題] 練習題
看板C_Sharp (C#)作者GreatShot (我要拿Ph.D.!!!)時間18年前 (2007/05/03 10:52)推噓9(9推 0噓 8→)留言17則, 6人參與討論串4/8 (看更多)
: 另外,如果要算的次方數很大的話
: (應該到五次或是六次就應該呼叫了..)
: 建議呼叫 Math.Pow 會快上很多....
: 裡面用的算法比你自己寫的連乘法好很多..
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
這點跟我認知很不一樣
我沒看過Math.Pow()的source所以不敢說它演算法好不好
我只能作實驗來觀察
source如下
public partial class Form1 : Form
{
[DllImport("kernel32.dll")]
extern static short QueryPerformanceCounter(ref long x);
[DllImport("kernel32.dll")]
extern static short QueryPerformanceFrequency(ref long x);
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
long ctr1 = 0, ctr2 = 0, freq = 0;
double sum = 0;
double a = 0;
Random myrand = new Random();
if (QueryPerformanceCounter(ref ctr1)!=0) // Begin timing.
{
for (int i=0; i<1000000000; i++) // Code being timed.
{
a = myrand.NextDouble() * 10; //Generate Random number
//3 options
sum = 6 * (a * a * a) + (5 * (a * a)) + (3 * a) - 1;
//sum = 6*Math.Pow(a,3) + 5*Math.Pow(a,2)+(3*a) - 1;
//sum = a * (a * (a * (+6) + 5) + 3) - 1;
}
QueryPerformanceCounter(ref ctr2); // Finish timing.
this.richTextBox1.AppendText("Start Value: " + ctr1 + "\n");
this.richTextBox1.AppendText("End Value: " + ctr2+"\n");
QueryPerformanceFrequency(ref freq);
this.richTextBox1.AppendText("QueryPerformanceCounter minimum
resolution: 1/" + freq + " seconds."+"\n");
this.richTextBox1.AppendText("100 Increment time: " +
(ctr2 - ctr1) * 1.0 / freq + " seconds."+"\n");
}
else
this.richTextBox1.AppendText("High-resolution counter not
supported."+"\n");
}
}
Result1: sum = 6 * (a * a * a) + (5 * (a * a)) + (3 * a) - 1;
Start Value: 757143142739
End Value: 757167788963
QueryPerformanceCounter minimum resolution: 1/14318180 seconds.
100 Increment time: 1.72132379953318 seconds.
Result2: sum = 6*Math.Pow(a,3) + 5*Math.Pow(a,2)+(3*a) - 1;
Start Value: 758355648048
End Value: 758755628202
QueryPerformanceCounter minimum resolution: 1/14318180 seconds.
100 Increment time: 27.9351254139842 seconds.
Result3: sum = a * (a * (a * (+6) + 5) + 3) - 1;
Start Value: 759758768779
End Value: 759783404913
QueryPerformanceCounter minimum resolution: 1/14318180 seconds.
100 Increment time: 1.720619101031 seconds.
再來換成冪次更高的
Result1: sum =
9 * (a * a * a * a * a * a) + 8 * (a * a * a * a * a) +
7 * (a * a * a * a) + 6 * (a * a * a) + (5 * (a * a)) + (3 * a) - 1;
Start Value: 766926901793
End Value: 766951596182
QueryPerformanceCounter minimum resolution: 1/14318180 seconds.
100 Increment time: 1.72468770472225 seconds.
Result2: sum =
9 * Math.Pow(a, 6) + 8 * Math.Pow(a, 5) + 7 * Math.Pow(a, 4) + 6 *
Math.Pow(a, 3) + 5 * Math.Pow(a, 2) + (3 * a) - 1;
Start Value: 769278944190
End Value: 770282636993
QueryPerformanceCounter minimum resolution: 1/14318180 seconds.
100 Increment time: 70.0991887935478 seconds.
Result3: sum =
a * (a * (a * ( a * (a * (a * (+9) +8) +7 ) +6) + 5) + 3) - 1;
Start Value: 774103750407
End Value: 774128401956
QueryPerformanceCounter minimum resolution: 1/14318180 seconds.
100 Increment time: 1.72169570434231 seconds.
這實驗其實很粗糙
但是可以看的出有非常明顯的差異
由此看來
第一種寫法跟第三種寫法幾乎是沒有差別的
也許是.net compiler會自己最佳化
但是第二種(使用Math.Pow())
很明顯的在執行時間上有段落差
冪次越大差距就越大
所以我的認知是要求效率的時候用連乘法會比Math.Pow()來的好
不過
也許是我實驗的方式有誤
有錯的話麻煩請各位賢達指正
謝謝 :)
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.133.110.47
推
05/03 11:08, , 1F
05/03 11:08, 1F
推
05/03 13:08, , 2F
05/03 13:08, 2F
推
05/03 13:15, , 3F
05/03 13:15, 3F
→
05/03 13:15, , 4F
05/03 13:15, 4F
→
05/03 13:16, , 5F
05/03 13:16, 5F
→
05/03 13:18, , 6F
05/03 13:18, 6F
推
05/03 13:41, , 7F
05/03 13:41, 7F
→
05/03 13:42, , 8F
05/03 13:42, 8F
推
05/03 19:38, , 9F
05/03 19:38, 9F
→
05/03 19:39, , 10F
05/03 19:39, 10F
→
05/03 19:39, , 11F
05/03 19:39, 11F
推
05/04 06:58, , 12F
05/04 06:58, 12F
→
05/04 06:59, , 13F
05/04 06:59, 13F
推
05/04 11:12, , 14F
05/04 11:12, 14F
推
05/04 11:22, , 15F
05/04 11:22, 15F
→
05/04 11:25, , 16F
05/04 11:25, 16F
推
05/05 18:14, , 17F
05/05 18:14, 17F
討論串 (同標題文章)
C_Sharp 近期熱門文章
PTT數位生活區 即時熱門文章