Информация об изменениях

Сообщение Re[16]: Реальная производительность WebAssembly? от 18.09.2017 21:49

Изменено 18.09.2017 22:01 alexzzzz

Re[16]: Реальная производительность WebAssembly?
Здравствуйте, Ikemefula, Вы писали:

A>>Самодельный quick sort непонятно зачем. Стандартный Array.Sort работает немного быстрее.

I>А мы сравниваем языки по перформансу, а не либы.

Тип System.Array в C# есть всегда. Входит в CLR наравне с System.Int32 или System.String. Мы же на станем велосипедить ещё и конкатенацию строк?

A>>А с такой реализацией TestClass:

A>>
class TestClass
A>>{
A>>    private Guid idGuid = Guid.NewGuid();
A>>    private Guid valueGuid = Guid.NewGuid();

A>>    public string Id => Format(idGuid);
A>>    public string Value => Format(valueGuid);
A>>}

A>>инициализация массива минимум в 3 раза быстрее начальной, а его сортировка минимум в 11 раз быстрее. Общее ускорение по сравнению с оригинальным кодом — более чем в 7 раз.
I>Я чет не понял, ты собираешься конвертить в строку при каждом доступе к свойству ? И зачем тебе гуид хранить, что бы памяти больше съесть ?

1. Я не вижу в коде никого, кому были бы нужны строковые представления гуидов. Ни одного их потребителя. Разве что TestClass.ToString, но и тот нигде не вызывается.
2. Guid — value-тип длинной 16 байт. В виде строки он занимает (навскидку) 32*2+6 байт + оверхед + 4/8 байт под ссылку на эту строку. Гуиды экономнее аналогичных строк раз в пять.

Я бы TestClass вообще в TestStruct переделал. ТЗ нет, JS нам не указ, никто так делать не запрещает, памяти расходуется ещё меньше, локальность данных лучше, скорость инициализации и сортировки ещё выше.

I>Выложи полную версию кода, только напиши на какой версии фремворка/шарпа надо сранивать. У меня, скажем, только 4.0 есть


Код и бинарники: https://bitbucket.org/alexzzzz/perftest
Кого Mercurial пугает, ссылка на zip: https://bitbucket.org/alexzzzz/perftest/downloads/
Framework 4.0, C# 6.0

Сейчас перетестил поаккуратнее, получилось, что оптимизированная версия быстрее оригинальной в 11 раз, а оптимизированная со структурами — в 16 раз.

Оригинальная версия на C#:
Initialization: 1710 ms, Sorting: 5464 ms, Total: 7174 ms
Initialization: 1847 ms, Sorting: 5162 ms, Total: 7009 ms
Initialization: 1976 ms, Sorting: 4937 ms, Total: 6913 ms
Initialization: 1729 ms, Sorting: 5275 ms, Total: 7004 ms
Initialization: 1988 ms, Sorting: 5031 ms, Total: 7019 ms
GC: 360 131 17 <-- количество сборок мусора по поколениям 0, 1, 2

Оптимизированная версия C#:
Initialization: 232 ms, Sorting: 398 ms, Total: 630 ms
Initialization: 265 ms, Sorting: 403 ms, Total: 668 ms
Initialization: 321 ms, Sorting: 394 ms, Total: 715 ms
Initialization: 271 ms, Sorting: 395 ms, Total: 666 ms
Initialization: 279 ms, Sorting: 404 ms, Total: 683 ms
GC: 46 24 8

Оптимизированная версия C# с заменой TestClass на TestStruct:
Initialization: 184 ms, Sorting: 256 ms, Total: 440 ms
Initialization: 185 ms, Sorting: 251 ms, Total: 436 ms
Initialization: 185 ms, Sorting: 248 ms, Total: 433 ms
Initialization: 185 ms, Sorting: 249 ms, Total: 434 ms
Initialization: 185 ms, Sorting: 247 ms, Total: 432 ms
GC: 4 4 4

I>Предлагаешь запилить рей-трейсинг алгоритм или обработку звука ? Не многовато ли для форумной беседы ?


Предлагаю запилить что-нибудь менее абстрактное, более практичное и с понятными конкретными требованиями. Например:

1. Считать png-картинку размера 1024x1024, перевести в чёрно-белый, заблюрить, повернуть на 90 градусов по часовой стрелке, сохранить обратно в png рядом с исходным.
2. Считать png-картинку размера 1024x1024 с лабиринтом (черные пикселы — препятствия, белые — проходимые). Найти кратчайший путь и левого нижнего угла в правый верхний. Результат сохранить в текстовый файл в виде количества узлов пути и списка их координат
N
(x1, y1)
(x2, y2)
...
(xN, yN)
Re[16]: Реальная производительность WebAssembly?
Здравствуйте, Ikemefula, Вы писали:

A>>Самодельный quick sort непонятно зачем. Стандартный Array.Sort работает немного быстрее.

I>А мы сравниваем языки по перформансу, а не либы.

Тип System.Array в C# есть всегда. Входит в CLR наравне с System.Int32 или System.String. Мы же не станем велосипедить ещё и конкатенацию строк?

A>>А с такой реализацией TestClass:

A>>
class TestClass
A>>{
A>>    private Guid idGuid = Guid.NewGuid();
A>>    private Guid valueGuid = Guid.NewGuid();

A>>    public string Id => Format(idGuid);
A>>    public string Value => Format(valueGuid);
A>>}

A>>инициализация массива минимум в 3 раза быстрее начальной, а его сортировка минимум в 11 раз быстрее. Общее ускорение по сравнению с оригинальным кодом — более чем в 7 раз.
I>Я чет не понял, ты собираешься конвертить в строку при каждом доступе к свойству ? И зачем тебе гуид хранить, что бы памяти больше съесть ?

1. Я не вижу в коде никого, кому были бы нужны строковые представления гуидов. Ни одного их потребителя. Разве что TestClass.ToString, но и тот нигде не вызывается.
2. Guid — value-тип длинной 16 байт. В виде строки он занимает (навскидку) 32*2+6 байт + оверхед + 4/8 байт под ссылку на эту строку. Гуиды экономнее аналогичных строк раз в пять.

Я бы TestClass вообще в TestStruct переделал. ТЗ нет, JS нам не указ, никто так делать не запрещает, памяти расходуется ещё меньше, локальность данных лучше, скорость инициализации и сортировки ещё выше.

I>Выложи полную версию кода, только напиши на какой версии фремворка/шарпа надо сранивать. У меня, скажем, только 4.0 есть


Код и бинарники: https://bitbucket.org/alexzzzz/perftest
Кого Mercurial пугает, ссылка на zip: https://bitbucket.org/alexzzzz/perftest/downloads/
Framework 4.0, C# 6.0

Сейчас перетестил поаккуратнее, получилось, что оптимизированная версия быстрее оригинальной в 11 раз, а оптимизированная со структурами — в 16 раз.

Оригинальная версия на C#:
Initialization: 1710 ms, Sorting: 5464 ms, Total: 7174 ms
Initialization: 1847 ms, Sorting: 5162 ms, Total: 7009 ms
Initialization: 1976 ms, Sorting: 4937 ms, Total: 6913 ms
Initialization: 1729 ms, Sorting: 5275 ms, Total: 7004 ms
Initialization: 1988 ms, Sorting: 5031 ms, Total: 7019 ms
GC: 360 131 17 <-- количество сборок мусора по поколениям 0, 1, 2

Оптимизированная версия C#:
Initialization: 232 ms, Sorting: 398 ms, Total: 630 ms
Initialization: 265 ms, Sorting: 403 ms, Total: 668 ms
Initialization: 321 ms, Sorting: 394 ms, Total: 715 ms
Initialization: 271 ms, Sorting: 395 ms, Total: 666 ms
Initialization: 279 ms, Sorting: 404 ms, Total: 683 ms
GC: 46 24 8

Оптимизированная версия C# с заменой TestClass на TestStruct:
Initialization: 184 ms, Sorting: 256 ms, Total: 440 ms
Initialization: 185 ms, Sorting: 251 ms, Total: 436 ms
Initialization: 185 ms, Sorting: 248 ms, Total: 433 ms
Initialization: 185 ms, Sorting: 249 ms, Total: 434 ms
Initialization: 185 ms, Sorting: 247 ms, Total: 432 ms
GC: 4 4 4

I>Предлагаешь запилить рей-трейсинг алгоритм или обработку звука ? Не многовато ли для форумной беседы ?


Предлагаю запилить что-нибудь менее абстрактное, более практичное и с понятными конкретными требованиями. Например:

1. Считать png-картинку размера 1024x1024, перевести в чёрно-белый, заблюрить, повернуть на 90 градусов по часовой стрелке, сохранить обратно в png рядом с исходным.
2. Считать png-картинку размера 1024x1024 с лабиринтом (черные пикселы — препятствия, белые — проходимые). Найти кратчайший путь и левого нижнего угла в правый верхний. Результат сохранить в текстовый файл в виде количества узлов пути и списка их координат
N
(x1, y1)
(x2, y2)
...
(xN, yN)