|
January 9th, 2013
01:58 pm - .NET JIT wonders Once upon a time there was a difference between 'for' and 'foreach': http://www.codeproject.com/Articles/6759/FOREACH-Vs-FOR-C Well, the article is now 8 years old, and instead of ugly and clumsy .NET 1.1 we have .NET 4.0 with tons of useful features and handfuls of sweet syntax sugar. But had anything change under the hood? Let us repeat the test from the article. Here is the C# code:
class Program {
static void testFor() {
int[] myInterger = new int[1];
int total = 0;
for (int i = 0; i < myInterger.Length; i++) {
total += myInterger[i];
}
}
static void testForeach() {
int[] myInterger = new int[1];
int total = 0;
foreach (int i in myInterger) {
total += i;
}
}
static void Main(string[] args) {
testFor();
testForeach();
}
}
}
OK, following the original article the next step is to disassemble actual binary code created by JIT compiler. This one is for 'for'
; Function ForForeach.Program.testFor (code starts at 0x2700a0).
; Offsets are relative to function start.
push ebp
mov ebp,esp
mov edx,1
mov ecx,6B4F4186h
call FFF52103
mov ecx,eax
xor edx,edx
mov eax,dword ptr [ecx+4]
test eax,eax
jle 0000000B
cmp dword ptr [ecx+edx*4+8],eax
inc edx
cmp eax,edx
jg FFFFFFF9
pop ebp
ret
And this is 'foreach'
; Function ForForeach.Program.testForeach (code starts at 0x2700e0).
; Offsets are relative to function start.
push ebp
mov ebp,esp
mov edx,1
mov ecx,6B4F4186h
call FFF520C3
mov ecx,eax
xor edx,edx
mov eax,dword ptr [ecx+4]
test eax,eax
jle 0000000B
cmp dword ptr [ecx+edx*4+8],eax
inc edx
cmp eax,edx
jg FFFFFFF9
pop ebp
ret
Judging from this huge difference in the disassembled samples I'm able to say that Microsoft had definitely introduced some improvements in the most recent versions on .NET framework and, therefore, the article I've mentioned in the beginning is no longer relevant.
|
Comments:
Оффтоп. Хотел спросить. Мне надо из программы на .NET загрузить сервис (реализованный в виде отдельного драйвера) На WinApi это решается с помощью OpenSCManager, CreateService и OpenService Можно ли без использования WinAPI сделать? Т.е. чисто средствами .NET?
Я бы посмотрел в сторону System.ServiceProcess, но если правильно помню, там всё заточено под .NET, так что если сервис в виде обычного бинарника, то ИМХО проще WinAPI дёргать.
Благодарю. Да, в данном случае оказалось, что "бык лучше".
From: | (Anonymous) |
Date: | January 24th, 2013 - 06:15 pm |
---|
| | You are an idiot | (Link) |
|
If you iterate over an array the compiler is smart enough to convert a foreach to a for loop.
| From: | steinkrauz |
Date: | January 24th, 2013 - 06:39 pm |
---|
| | Re: You are an idiot | (Link) |
|
There was not so smart a compiler 8 years ago.
From: | (Anonymous) |
Date: | April 2nd, 2014 - 02:18 pm |
---|
| | Бред на бреде и бредом погоняет | (Link) |
|
Вставлю свои 5 копеек. Что этот тест показывать должен? На сколько компилятор оптимизирует присвоение одной переменной другой в безумном окружении?
Объявите массив на 100 элементов и проинициализируйте рандомными значениями. Чтобы компилятор даже и не думал проводить оптимизации. А затем давайте ассемблерный разворот.
| | | Re: Бред на бреде и бредом погоняет | (Link) |
|
Nu tak sḑelayţe po Vašey metodike i zaķiņte rezuļtatî şuda ili na Pastebin.
A s voprosami po metodologii obraŝayţeş v orifinaļnuyu staţyu na CodeProject |
|
|
LJ.Rossia.org |