Re: C# generics: Тормоза. Что я не так делаю?
От: VladD2 Российская Империя www.nemerle.org
Дата: 12.01.05 01:20
Оценка: 18 (1)
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>    public static IntWrapper operator -(IntWrapper l, IntWrapper r)
ПК>    {
ПК>        return new IntWrapper(l.value_ - r.value_);
ПК>    }

ПК>    public int CompareTo(IntWrapper r)
ПК>    {
ПК>        return this - r;
ПК>    }

ПК>         DelegateTest<IntWrapper>.CompareElement compare_element_delegate =
ПК>             delegate(IntWrapper x, IntWrapper y) { return x - y; };

ПК>

ПК>(*) Правда, оказалось, что то ли сортировка там не вполне сортирует, то ли поиск не вполне ищет, то ли

Прогаммисты хреновые...

ПК> и то, и другое, но это нам сейчас совершенно неважно


А, ну, да. У теста провекрки на вшивость не проходят, но это не важно... Разве это может повлиять на результат?

Обрати внимание на приведенные мною фрагменты твоего теста. Заметил выделенное жирным? Вот из-за них и тесты глючат. У тебя в массивах явно попадаются отрицательные велечины и когда ты большую отрицательную величину вычиташь из большой положительной, то происходит переполнение, которое без дополнительной обработки (которую только на ассемблере сделать можно) приводит к неверному результату сравнения. После этого никакие результаты уже не интересны, так как сортировка просходит абы как.

Я вот заменил в твоем тесте:
public int CompareTo(IntWrapper r)
{
        return this - r;
}

на:
public int CompareTo(IntWrapper r)
{
    return value_ - r.value_;
}

и получил удвоение производительности этого глюкалова. Вот только что я измеряю хоть убей сказать не могу.

Убедиться в моей правоте можно включив проверку переполения. Для Шарпа это делается в "Project\Properties+Build+Advanced".

В общем, нужно или делать проверку полноценной:
return _value > r._value ? 1 : _value == r._value ? 0 : -1;

или заменять делегаты и интерфейсы на содержащие метод Great и использовать в алгоритме сортировки его.

ПК>, поэтому прошу по этому поводу не пинать:




ПК> в любом случае, алгоритмы и в C#, и в C++ одни и те же, так что на время, что нас и интересует, это влиять не должно.


Ага. И главное полная гарантия, что переполнение обрабатывается одинаково и никаких проблем нет.

Как я уже сказал, замена пары байт кода в товем тесте сравнивает результаты (правда вывод этот основан на относительных результатах, так как С++-ного проекта у меня нет).

В общем, присылай С++-шный проект посмотрим...
... << RSDN@Home 1.1.4 beta 3 rev. 273>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.