我已經搜索了* operator和Math.BigMul method之間的差異,但什麼都沒發現。所以我決定我會試着互相測試他們的效率。請看下面的代碼:爲什麼常規乘法運算符比BigMul方法效率更高?
public class Program
{
static void Main()
{
Stopwatch MulOperatorWatch = new Stopwatch();
Stopwatch MulMethodWatch = new Stopwatch();
MulOperatorWatch.Start();
// Creates a new MulOperatorClass to perform the start method 100 times.
for (int i = 0; i < 100; i++)
{
MulOperatorClass mOperator = new MulOperatorClass();
mOperator.start();
}
MulOperatorWatch.Stop();
MulMethodWatch.Start();
for (int i = 0; i < 100; i++)
{
MulMethodClass mMethod = new MulMethodClass();
mMethod.start();
}
MulMethodWatch.Stop();
Console.WriteLine("Operator = " + MulOperatorWatch.ElapsedMilliseconds.ToString());
Console.WriteLine("Method = " + MulMethodWatch.ElapsedMilliseconds.ToString());
Console.ReadLine();
}
public class MulOperatorClass
{
public void start()
{
List<long> MulOperatorList = new List<long>();
for (int i = 0; i < 15000000; i++)
{
MulOperatorList.Add(i * i);
}
}
}
public class MulMethodClass
{
public void start()
{
List<long> MulMethodList = new List<long>();
for (int i = 0; i < 15000000; i++)
{
MulMethodList.Add(Math.BigMul(i,i));
}
}
}
}
概括起來:我創建了兩個類 - MulMethodClass
和MulOperatorClass
執行兩個start
方法,填補List<long
型與i multiply by i
多次值的varible。這些方法之間的唯一區別是在操作符類中使用* operator
,並且在方法類中使用Math.BigMul
。
我創建了這些類中的每一個的100個實例,只是爲了防止和溢出列表(我無法創建1000000000個項目列表)。
然後我測量100個類中每個類執行所花費的時間。結果是相當奇特:我已經做了這個過程大約15倍,平均結果(以毫秒爲單位):
操作= 20357
方法= 24579
即約4.5秒差,我認爲是很多。我查看了BigMul method的源代碼 - 它使用了* operator
,並且幾乎做了同樣的事情。
所以,我quesitons:
- 爲什麼這樣的方法甚至存在嗎?它完全一樣。
- 如果它完全一樣,爲什麼這兩者之間存在巨大的效率差異?
我只是好奇:)
嗨!它可以通過'int'連接到''long' BigMul –
@ agent5566我嘗試將'start'方法中的'i'轉換爲'long',並得到了相同的結果。 – Eminem
另外,您在調用'BigMul'方法時有一些開銷,請嘗試將運算符封裝到方法 –