我寫了一些簡單的 c# 代碼來測驗一個數字是否是素數。當我在 WinForms 應用程式和控制臺應用程式中運行代碼時,我驚訝地發現性能存在巨大差異。
代碼很簡單
ulong num = 18446744073709551557;
Stopwatch stopwatch = Stopwatch.StartNew();
if (num % 2 == 0)
{
stopwatch.Stop();
MessageBox.Show("Composite " stopwatch.ElapsedMilliseconds.ToString());
return;
}
for (ulong i = 3; i <= Math.Sqrt(num); i = 2)
{
if (num % i == 0)
{
stopwatch.Stop();
MessageBox.Show("Composite " stopwatch.ElapsedMilliseconds.ToString());
return;
}
}
stopwatch.Stop();
MessageBox.Show("Prime " stopwatch.ElapsedMilliseconds.ToString());
對于控制臺應用程式,MessageBox.Show()
我使用Console.WriteLine()
. 現在我會認為性能差異可以忽略不計。但是,控制臺應用程式的性能似乎始終比 Windows 表單應用程式差。
由 Visual Studio 2022 編譯,對于除錯版本(無需除錯即可運行),winforms 應用程式需要約 36000 毫秒,但控制臺應用程式需要約 156000 毫秒。對于發布版本(無需除錯即可運行),winforms 約 35500 毫秒,控制臺約 137000 毫秒。(有趣的是,如果運行除錯,兩者似乎運行得稍微快一些。)這種差異的原因是什么?
uj5u.com熱心網友回復:
我無法重現該問題。
這是我在發行版中運行的發現的摘要,并且沒有除錯器(VS 中的 Ctrl-F5)。控制臺和 WinForms 存在 32 位和 64 位行程之間的顯著差異。
IDE | 平臺 | 安慰 | WinForms |
---|---|---|---|
VS2017/NET 4.8 | x32 | 43.94 秒 | 43.21 秒 |
VS2017/NET 4.8 | x64 | 4.43 秒 | 4.38 秒 |
VS2022/NET 4.8 | x32 | 43.62 秒 | 43.33 秒 |
VS2022/NET 4.8 | x64 | 4.56 秒 | 4.45 秒 |
VS2022/NET 6.0 | x64 | 4.46 秒 | 4.45 秒 |
注意:控制臺和 winforms 之間的差異在噪音范圍內。
代碼
兩個專案的測驗代碼相同
internal static bool IsPrimeTest(ulong num)
{
if (num == 1)
{
return true;
}
if (num % 2 == 0)
{
return false;
}
for (ulong i = 3; i <= Math.Sqrt(num); i = 2)
{
if (num % i == 0)
{
return false;
}
}
return true;
}
和跑步者
private void button1_Click(object sender, EventArgs e)
{
button1.Enabled = false;
ulong x = 18446744073709551557ul;
textBox1.Text = "Burn-in";
Program.IsPrimeTest(x / 16);
textBox1.Text = "Start timming";
var sw = Stopwatch.StartNew();
bool ok = Program.IsPrimeTest(x);
sw.Stop();
string bits = Environment.Is64BitProcess ? "x64" : "x32";
textBox1.Text = $"Bits={bits}, Prime={ok}, Time={sw.Elapsed.TotalSeconds:f2} sec";
button1.Enabled = true;
}
作為有趣的旁注,使用 Intel Fortran 進行的類似測驗產生了Time = 3.80 sec
,它只比 C# 快一點。當然,Fortran 不支持無符號整數,因此必須使用全精度浮點數進行檢查。每個mod(x,p)==0
呼叫都被翻譯成x/p == int(x/p)
.
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/481525.html
上一篇:禁止:/api/v1.0/user/create-user/&{“detail”:“未提供身份驗證憑據。”}DJANGO
下一篇:返回列表