Re[3]: Производительность кода Nemerle
От: VladD2 Российская Империя www.nemerle.org
Дата: 24.02.10 13:13
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Написал тестовое приложение, производящее пузырьковую сортировку на C#, VB и Nemerle. В результате, на массиве из 10000 целых, код Nemerle выполнялся почти на 30% дольше чем аналог на C#.

А>Хотелось бы понять, я не корректно реализовал сортировку на Nemerle, или он действительно НЕ БЫСТР?
А>Тестовый проект

А -optimize ты добавлял при компиляции? Компилировать нужно в релиз добавляя -optimize, а запускать из консоли.
http://nemerle.org/Banners/?g=dark
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: Производительность кода Nemerle
От: VladD2 Российская Империя www.nemerle.org
Дата: 24.02.10 13:15
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Не совсем понял, как Mono или ручная компиляция может повлиять на результаты теста?


Конкретно макрос for (в отличии от while или foreach) генерирует на самый оптимальный код. Насколько я помню -optimize устраняет его грязь.

В прочем, можешь просто воспользоваться рекурсивными функциями. Тогда код будет такой какой ты захочешь сам.
http://nemerle.org/Banners/?g=dark
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: Производительность кода Nemerle
От: hardcase Пират http://nemerle.org
Дата: 24.02.10 13:16
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>А -optimize ты добавлял при компиляции? Компилировать нужно в релиз добавляя -optimize, а запускать из консоли.


Собственно приведенный мною листинг рефлектора и есть продукт компиляции в Release-конфигурацию.
Сегодня пробовал собирать руками с явной -O опцией. Та же история.
http://nemerle.org/Banners/?t=Developer!&g=dark /* иЗвиНите зА неРовнЫй поЧерК */
Re[5]: Производительность кода Nemerle
От: VladD2 Российская Империя www.nemerle.org
Дата: 24.02.10 13:18
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Собственно приведенный мною листинг рефлектора и есть продукт компиляции в Release-конфигурацию.

H>Сегодня пробовал собирать руками с явной -O опцией. Та же история.

Ну, перепишете этот код с использованием рекурсивных фукнций (только короче выйдет) или поправьте этот for. Его явно на скорую руку кто-то слепил и оставил как есть, так как он по жизни на фиг не уперся.
http://nemerle.org/Banners/?g=dark
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: Производительность кода Nemerle
От: VladD2 Российская Империя www.nemerle.org
Дата: 17.03.10 22:54
Оценка: 21 (1)
Здравствуйте, Аноним, Вы писали:

А>Написал тестовое приложение, производящее пузырьковую сортировку на C#, VB и Nemerle. В результате, на массиве из 10000 целых, код Nemerle выполнялся почти на 30% дольше чем аналог на C#.

А>Хотелось бы понять, я не корректно реализовал сортировку на Nemerle, или он действительно НЕ БЫСТР?
А>Тестовый проект

Я там (в ревизии 8631) кое что подкрутил в кодогенерации. Попробуйте еще разок свои тесты прогнать (с новой версией).
http://nemerle.org/Banners/?g=dark
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: Производительность кода Nemerle
От: hardcase Пират http://nemerle.org
Дата: 18.03.10 07:55
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Я там (в ревизии 8631) кое что подкрутил в кодогенерации. Попробуйте еще разок свои тесты прогнать (с новой версией).


Найс!

Введите размер массива:
10000

****************
Тестируем VisualBasic
BubbleSort:
00:00:00.7691320
00:00:00.4429799
00:00:00.4428454
00:00:00.4438844
00:00:00.4414162
00:00:00.4415142
00:00:00.4421316
00:00:00.4416443
00:00:00.4423140
00:00:00.4424831
Среднее время: 00:00:00.4423570


BubbleSortInt:
00:00:00.4447006
00:00:00.4485060
00:00:00.4473925
00:00:00.4635526
00:00:00.4525687
00:00:00.4694864
00:00:00.4562120
00:00:00.4604071
00:00:00.4437753
00:00:00.4429508
Среднее время: 00:00:00.4538723



****************
Тестируем C#
BubbleSort:
00:00:00.7766143
00:00:00.4216901
00:00:00.4208590
00:00:00.4221488
00:00:00.4219378
00:00:00.4223835
00:00:00.4214906
00:00:00.4216814
00:00:00.4227876
00:00:00.4209740
Среднее время: 00:00:00.4217725


BubbleSortInt:
00:00:00.3577879
00:00:00.3378757
00:00:00.3378542
00:00:00.3592086
00:00:00.3385027
00:00:00.3376730
00:00:00.3420498
00:00:00.3386263
00:00:00.3386338
00:00:00.3382749
Среднее время: 00:00:00.3409665



****************
Тестируем Nemerle
BubbleSort:
00:00:00.8053663
00:00:00.3777235
00:00:00.3908527
00:00:00.3783443
00:00:00.3779020
00:00:00.3779442
00:00:00.3780924
00:00:00.3782242
00:00:00.3784012
00:00:00.3793557
Среднее время: 00:00:00.3796489


BubbleSortInt:
00:00:00.6776800
00:00:00.2941761
00:00:00.2942800
00:00:00.2969601
00:00:00.3038357
00:00:00.2946906
00:00:00.2939845
00:00:00.2940095
00:00:00.2943398
00:00:00.2961005
Среднее время: 00:00:00.2958196


Пришлось подправить пару копипаст багов в тестах Анонимуса.

Теперь рефлектор не показывает никаких тернарных операций в немерловых операторах сравнения:
public static void BubbleSortInt(int[] items, int left, int right)
{
    int index = 0;
    int num2 = 0;
    for (num2 = left + 1; num2 <= right; num2++)
    {
        index = right;
        while (true)
        {
            if (index < num2)
            {
                break;
            }
            if (items[index - 1] > items[index])
            {
                int num3 = index - 1;
                int num4 = items[num3];
                items[num3] = items[index];
                items[index] = num4;
            }
            index--;
        }
    }
}
http://nemerle.org/Banners/?t=Developer!&g=dark /* иЗвиНите зА неРовнЫй поЧерК */
Re[5]: Производительность кода Nemerle
От: hardcase Пират http://nemerle.org
Дата: 18.03.10 08:04
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Пришлось подправить пару копипаст багов в тестах Анонимуса.


Выложил измененную версию.
http://nemerle.org/Banners/?t=Developer!&g=dark /* иЗвиНите зА неРовнЫй поЧерК */
Re[6]: Производительность кода Nemerle
От: Аноним  
Дата: 18.03.10 11:55
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Здравствуйте, hardcase, Вы писали:


H>>Пришлось подправить пару копипаст багов в тестах Анонимуса.


H>Выложил измененную версию.


от kkolyan

прогнал вашу версию на win64

result
Re[7]: Производительность кода Nemerle
От: Аноним  
Дата: 18.03.10 12:00
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, hardcase, Вы писали:


H>>Здравствуйте, hardcase, Вы писали:


H>>>Пришлось подправить пару копипаст багов в тестах Анонимуса.


H>>Выложил измененную версию.


версия самая последняя(взял инсталлер с google nemerle), nemerle проект компилит не подецки долго, что есть не оч хорошо
Re[8]: Производительность кода Nemerle
От: hardcase Пират http://nemerle.org
Дата: 18.03.10 12:45
Оценка:
Здравствуйте, Аноним, Вы писали:

Странно, а ведь проверял — что-то я похоже намудрил, и Ctrl+F5 это не также как запуск с "консоли".
Действительно, Nemerle пока еще проигрывает даже если добавить блок unchecked (если в опциях компиляции VB.NET проекта убрать проверку переполнения, то его результат идентичен с C#).

А>версия самая последняя(взял инсталлер с google nemerle), nemerle проект компилит не подецки долго, что есть не оч хорошо


Эта проблема видимо только в x64 системах: одна и та же ревизия компилятора на Win 2003 R2 Sp2 работает влет, а вот на XP x64 Sp2 — невероятно медленно.
http://nemerle.org/Banners/?t=Developer!&g=dark /* иЗвиНите зА неРовнЫй поЧерК */
Re[5]: Производительность кода Nemerle
От: VladD2 Российская Империя www.nemerle.org
Дата: 18.03.10 15:04
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Теперь рефлектор не показывает никаких тернарных операций в немерловых операторах сравнения:


Это я и подкручивал. Ребята разрабатывавшие MSIL были или очень веселыми ребятами, или ленивыми ассемблерщиками. Они ввели весьма странный набор команд который требует трех инструкций для реализации => <= или требует переписывания логики булевых выражений (что не так то просто). При этом они тупо оптимизировали (в JIT-компиляторе и NGen) генерацию маш.кода для составных инструкций.

Те кто писал кодогенерацию для немерла выбрали другой путь реализации операторов сравнения (>, <, => и <=) которые JIT не оптимизирует (а зря, кстати). Я переписал все образом сходным с тем как это происходит в C#. Потому и Рефлектор стал распознавать паттерн корректно.

Еще не мешало бы подправить макрос "for", так чтобы он генерировал код полностью аналогичный for-у из C#. Но мне этим заниматься в лом, так как сам я "for" почти не использую, и есть у нас и другие дела (с). Если ктому-то охота потренироваться с не сложным макросом, то — милости просим. Присылайте код сюда, или комитьте его в СВН (если есть права). Но после тестов (в том числе и в рефлекторе).
http://nemerle.org/Banners/?g=dark
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[8]: Производительность кода Nemerle
От: VladD2 Российская Империя www.nemerle.org
Дата: 18.03.10 15:06
Оценка:
Здравствуйте, Аноним, Вы писали:

А>nemerle проект компилит не подецки долго, что есть не оч хорошо


Видимо что-то не так с прекомпиляции NGen-ом. Если можете, попробуйте сами, вручную, прекомпилировать все бинарники из каталога %ProgramFiles%\Nemerle с помощью ngen.exe.
http://nemerle.org/Banners/?g=dark
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[9]: Производительность кода Nemerle
От: VladD2 Российская Империя www.nemerle.org
Дата: 18.03.10 15:09
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Эта проблема видимо только в x64 системах: одна и та же ревизия компилятора на Win 2003 R2 Sp2 работает влет, а вот на XP x64 Sp2 — невероятно медленно.


Есть два различия:
1. Макрос "for" реализован не очень качественно.
2. Немерле генерируется опрераторы сравнения с логикой обратной C#.

Еще может быть, что некорректно реализован unchecked.

Если у кого-то есть время, сравните IL.
http://nemerle.org/Banners/?g=dark
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[10]: Производительность кода Nemerle
От: hardcase Пират http://nemerle.org
Дата: 18.03.10 15:35
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, hardcase, Вы писали:


H>>Эта проблема видимо только в x64 системах: одна и та же ревизия компилятора на Win 2003 R2 Sp2 работает влет, а вот на XP x64 Sp2 — невероятно медленно.


VD>Есть два различия:

VD>1. Макрос "for" реализован не очень качественно.
VD>2. Немерле генерируется опрераторы сравнения с логикой обратной C#.

Это я про запуск и работу компилятора.
При этом эффективность кода в этих пузырьковых бенчмарках идентична (на глаз не заметна) и архитектура не влияет. Те результаты, которые я выкладывал — чушь.


Ок. Я посмотрю что вытворяет макрос for.
http://nemerle.org/Banners/?t=Developer!&g=dark /* иЗвиНите зА неРовнЫй поЧерК */
Re[11]: Производительность кода Nemerle
От: VladD2 Российская Империя www.nemerle.org
Дата: 18.03.10 16:25
Оценка:
Здравствуйте, hardcase, Вы писали:

H>При этом эффективность кода в этих пузырьковых бенчмарках идентична (на глаз не заметна) и архитектура не влияет. Те результаты, которые я выкладывал — чушь.


Согласен, но проще устранить всяческие причины для придирок, чем объяснять все это тем кто пытается найти фатальный недостаток.
http://nemerle.org/Banners/?g=dark
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[12]: Производительность кода Nemerle
От: hardcase Пират http://nemerle.org
Дата: 20.03.10 15:05
Оценка:
Здравствуйте, VladD2, Вы писали:

Поломав голову над for я так и не сообразил, как можно сохранить структурную семантику C#-овского цикла for() в Nemerle.
В C# конструкция (a — это List<string>):
for(int i = 0; i < a.Count; ++i) 
    System.Console.WriteLine(a[i]);

что совершенно эквивалентно записи
    int i = 0;
    goto check;
loop:
    System.Console.WriteLine(a[i]);
    ++i;
check:
    if(i < a.Count) goto loop;


В Nemerle для аналогичного for() получаем хвостовую рекурсию
mutable i = 0;
def loop() {
    match(i < a.Count) {
        | true =>
            WriteLine(a[i]);
            ++i;
            loop()
        | _ => ()
    }
}
loop()


Которая по генерируемому коду эквивалентна while() циклу C#:
int i = 0;
while (true) {
    if (i >= a.Count)
       break;
    Console.WriteLine(a[num]);
    i++;
}


Не понятно, почему такой while-цикл работает медленнее for...
http://nemerle.org/Banners/?t=Developer!&g=dark /* иЗвиНите зА неРовнЫй поЧерК */
Re[13]: Производительность кода Nemerle
От: VladD2 Российская Империя www.nemerle.org
Дата: 20.03.10 19:04
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Не понятно, почему такой while-цикл работает медленнее for...


Не факт, что дело в реализации for.

Может быть все же проблема в том, что не кооректно работает unchecked?
http://nemerle.org/Banners/?g=dark
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[14]: Производительность кода Nemerle
От: hardcase Пират http://nemerle.org
Дата: 20.03.10 20:28
Оценка: 30 (1)
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, hardcase, Вы писали:


H>>Не понятно, почему такой while-цикл работает медленнее for...


VD>Не факт, что дело в реализации for.


VD>Может быть все же проблема в том, что не кооректно работает unchecked?


Разобрался. unchecked в Nemerle работает нормально, дело не в нем.

Оказывается следующий код обмена значениями (именно такой получается для оператора <->) в тестах
int prev = index - 1;
int x = items[prev];
items[prev] = items[index];
items[index] = x;

работает ровно в два раза медленнее
int x = items[index - 1];
items[index - 1] = items[index];
items[index] = x;


Т.о. если заменить оператор обмена значениями <-> на второй вариант (как в C#) все тесты отрабатывают за одинаковое время.
Хоть структурная реализация for в Nemerle и отличается от C#, но она ей эквивалентна по скоростным параметрам (в приведенном тесте, на самом деле чуточку медленнее).
Все встало на свои места.
http://nemerle.org/Banners/?t=Developer!&g=dark /* иЗвиНите зА неРовнЫй поЧерК */
Re[15]: Производительность кода Nemerle
От: VladD2 Российская Империя www.nemerle.org
Дата: 20.03.10 21:52
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Оказывается следующий код обмена значениями (именно такой получается для оператора <->) в тестах

H>
H>int prev = index - 1;
H>int x = items[prev];
H>items[prev] = items[index];
H>items[index] = x;
H>

H>работает ровно в два раза медленнее
H>
H>int x = items[index - 1];
H>items[index - 1] = items[index];
H>items[index] = x;
H>


Вот уж странно.

Почти уверен, что в иной ситуации все может оказаться наоборт, так как переменную куда проще разместить в регистре нежели производить оптимизацию "устранение общего подвыражения".

Во истину — не исповедимы пути Майкрософта.
http://nemerle.org/Banners/?g=dark
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[15]: Производительность кода Nemerle
От: Аноним  
Дата: 21.03.10 10:43
Оценка:
H>Разобрался. unchecked в Nemerle работает нормально, дело не в нем.

H>Оказывается следующий код обмена значениями (именно такой получается для оператора <->) в тестах

H>
H>int prev = index - 1;
H>int x = items[prev];
H>items[prev] = items[index];
H>items[index] = x;
H>

H>работает ровно в два раза медленнее
H>
H>int x = items[index - 1];
H>items[index - 1] = items[index];
H>items[index] = x;
H>


H>Т.о. если заменить оператор обмена значениями <-> на второй вариант (как в C#) все тесты отрабатывают за одинаковое время.

H>Хоть структурная реализация for в Nemerle и отличается от C#, но она ей эквивалентна по скоростным параметрам (в приведенном тесте, на самом деле чуточку медленнее).
H>Все встало на свои места.

Закомментитровал код обмена значений и получил такой-же результат, что и ранее. Оператор <-> сдесь не причем.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.