Salinan VS2013 Ultimate saya mengkompilasi kode ini selama 60+ detik:
class Program
{
static void Main(string[] args)
{
double dichotomy = Dichotomy(
d =>
{
try
{
int size = (int) d;
byte[] b = new byte[size];
return -b.Length;
}
catch (Exception)
{
return 0;
}
},
0,
int.MaxValue,
1);
Console.WriteLine(dichotomy);
Console.ReadKey();
}
private static double Dichotomy(
Func<double, double> func,
double a,
double b,
double epsilon)
{
double delta = epsilon / 10;
while (b - a >= epsilon)
{
double middle = (a + b) / 2;
double lambda = middle - delta, mu = middle + delta;
if (func(lambda) < func(mu))
b = mu;
else
a = lambda;
}
return (a + b) / 2;
}
}
Tetapi jika saya mengganti double
dengan int
, itu segera dikompilasi. Bagaimana bisa dijelaskan ...?
c#
.net
visual-studio
debugging
visual-studio-2013
Alex Zhukovskiy
sumber
sumber
double
dan instan denganint
. Mesin 3.4Ghz.Jawaban:
Saya repro, 27 detik di mesin saya. Pelaku jahat adalah MsMpEng.exe, itu membakar 100% inti selama itu. Mudah dilihat di tab Proses Manajer Tugas.
Ini adalah layanan Windows Defender, yang benar-benar melakukan pemindaian malware. Menonaktifkannya dengan menghapus centang pada opsi "Aktifkan perlindungan waktu nyata" secara instan memperbaiki penundaan. Begitu pula dengan menambahkan jalur tempat saya menyimpan proyek ke kotak "Lokasi file yang dikecualikan", mungkin pendekatan yang Anda sukai.
Saya tidak suka menebak alasan yang mendasarinya, tetapi harus berasumsi bahwa kode sumber Anda memicu aturan malware. Bukan penjelasan yang bagus, saya tidak melihat penundaan ketika saya menargetkan versi .NET <4.0. Oke, saya menyerah :)
sumber
MSSE
dan.Net 4.0+
siapa pelakunyaSaya tidak bisa mengatakannya secara resmi karena sudah 20+ tahun sejak saya mengutak-atik level kode assembly, tetapi saya dapat dengan mudah mempercayai ini.
Perbedaan antara operasi floating point standar IEEE dan yang diimplementasikan oleh prosesor sering memaksa penautan dalam rutinitas perpustakaan untuk melakukan terjemahan, sedangkan matematika integer hanya dapat menggunakan instruksi CPU. Pada saat IEEE menetapkan standar, mereka membuat beberapa pilihan yang sangat tidak umum dalam penerapannya, dan terutama yang jauh lebih mahal untuk diterapkan di microcode, dan tentu saja sistem PC saat ini dibangun di sekitar chip turunan dari 80387 dan 80486 , yang mendahului standar.
Jadi jika saya benar, peningkatan waktu adalah karena ini melibatkan penambahan potongan kode perpustakaan ke tautan, dan penautan adalah bagian besar dari waktu pembuatan yang cenderung tumbuh secara multiplikatif saat potongan yang dapat dipindahkan ditambahkan.
Clang di Linux mungkin mengalami atau mungkin tidak mengalami pelambatan yang sama; jika itu memang menghindarinya, dan memperluas dugaan saya lebih jauh, itu akan menjadi artefak dari libc memori bersama yang ada di mana-mana yang Anda dapatkan di sana dan pengoptimalan penaut di sekitarnya.
sumber