steinkrauz - .NET JIT wonders

> Recent Entries
> Archive
> Friends
> User Info

January 9th, 2013


Previous Entry Add to Memories Tell A Friend Next Entry
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.

(7 comments | Leave a comment)

Comments:


[User Picture]
From:[info]hex_laden
Date:January 9th, 2013 - 11:18 am
(Link)
Оффтоп. Хотел спросить. Мне надо из программы на .NET загрузить сервис (реализованный в виде отдельного драйвера)
На WinApi это решается с помощью OpenSCManager, CreateService и OpenService
Можно ли без использования WinAPI сделать? Т.е. чисто средствами .NET?
[User Picture]
From:[info]steinkrauz
Date:January 9th, 2013 - 12:01 pm
(Link)
Я бы посмотрел в сторону System.ServiceProcess, но если правильно помню, там всё заточено под .NET, так что если сервис в виде обычного бинарника, то ИМХО проще WinAPI дёргать.
[User Picture]
From:[info]hex_laden
Date:January 10th, 2013 - 03:11 pm
(Link)
Благодарю. Да, в данном случае оказалось, что "бык лучше".
From:(Anonymous)
Date:January 24th, 2013 - 03: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.
[User Picture]
From:[info]steinkrauz
Date:January 24th, 2013 - 03:39 pm

Re: You are an idiot

(Link)
There was not so smart a compiler 8 years ago.
From:(Anonymous)
Date:April 2nd, 2014 - 12:18 pm

Бред на бреде и бредом погоняет

(Link)
Вставлю свои 5 копеек. Что этот тест показывать должен? На сколько компилятор оптимизирует присвоение одной переменной другой в безумном окружении?

Объявите массив на 100 элементов и проинициализируйте рандомными значениями. Чтобы компилятор даже и не думал проводить оптимизации. А затем давайте ассемблерный разворот.
[User Picture]
From:[info]steinkrauz
Date:April 2nd, 2014 - 01:19 pm

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

> Go to Top
LJ.Rossia.org