Как стать автором
Обновить
61
Карма
0
Рейтинг

Open source contributor

  • Подписчики 57
  • Подписки 3

Производительность Unity C#: советы и приемы

Кстати для Linq, который не делает аллокаций в куче, я писал небольшую библиотеку. Конечно, есть ограничения по сравнению с Linq (а именно - моя библиотека используется если вычисления происходят внутри метода, а последовательности никуда не передаются и не возвращаются). Список методов тут.

Вообще аналогичных либ - легион, в readme можно увидеть их сравнения, если хочется повыбирать.

Введение в сборку мусора .NET

Не отвечу на вопрос, но вообще например в Mono поколений 2. Думаю, что в дотнете просто решили, что два - маловато, а четыре уже не надо.)

Как сделать красивый вывод текста на C#

Автор, вы бы хотя бы дали кому-нибудь свой код на ревью.

Кстати, вот [эта](https://github.com/spectreconsole/spectre.console) либа позволяет это делать очень недурно.

Пишем «калькулятор» на C#. Часть I. Вычисление значения, производная, упрощение, и другие гуси

Собственно, спустя более чем полтора года я готов рассказать намного больше.


Сейчас в библиотеке используются Linq.Expression для компиляции в Func, я даже писал детальную статью по этой теме.


Но само математическое выражение не будет в виде дотнетовских экспрешнов, так как в этом нет никакого смысла — нам нужны конструкции, которых в сишарпе тупо нет (на основе синтаксиса которого эти linq.expression и работают). Да и работать с ними вряд ли было бы так же удобно, как с кастомными, которые теперь переписаны на рекорды.

С C# все будет хорошо, и Страуструп тут не при чем

Хорошая есть фраза, смысл примерно такой.

Да, фича пилится для 1% разработчиков. Но то, что этот 1% делает, будет потом использоваться остальными 99% разработчиками.

Самодельный стратостат. Часть 3

Здорово. Очень активно жду нормальное видео!

FOSS News №90 — дайджест материалов о свободном и открытом ПО за 20—26 сентября 2021 года

У нас много аналогов, и много чего сделано лучше, чем что-либо подобное на западе. Хабр тот же. Нет нормальных англоязычных аналогов хабра.

Другое дело, что сделать что-то лучше, чем гитхаб - ну это нужно трижды из кожи вылезти. Я просто не представляю объем работы.

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

Уроки по SDL 2: Урок 8 — прозрачный фон

  SDL_Window* window; //инициализация переменной окно
  SDL_Renderer* gRenderer; //инициализация рендерной переменной.
  
  SDL_Surface *backgroundImage; //инициализация слоев
  SDL_Surface *humanImage;
  
  SDL_Texture *backGroundTex;  //инициализация текстуры
  SDL_Texture *humanTex;  

Объявление переменных вижу. Инициализацию - не вижу.

Самодельный стратостат. Часть 2

Очень интересно, жалко, что видоса с 25км нет. Давай еще раз, чтобы получилось уже наконец!)

Повысьте свою продуктивность с помощью расширений Productivity Power Tools в Visual Studio 2022

В VS мы увидим то же, если просто навести на семантический символ (тип, метод, т. д.).

Ускоряем цикл foreach до for

Однако F# согласен со мной, как и дельфи.

Дело вкуса

cc @orion_tvv, @Timofeuz

Ускоряем цикл foreach до for

Это по каким канонам "каноничнее"?

Ускоряем цикл foreach до for

Удивительно. У человека сверху хотя бы я объяснял это тем, что там джамп вместо колла. Почему здесь джит не смог сделать что надо, при том, что там колл - непонятно. Может на шестом дотнете получится?

Ускоряем цикл foreach до for

Так, я на всякий случай уточню - вы сюда

[Benchmark]
// НЕ СЮДА
public int ForeachWithRangeEnumeratorRawWithLocal()
{
    var enumerator = (0..(Iterations - 1)).GetEnumerator();        
    return EnumerateItAll(enumerator);

    // А СЮДА?
    static int EnumerateItAll(RangeEnumerator enumerator)
    {
        var a = 0;
        while (enumerator.MoveNext())
            a += enumerator.Current;
        return a;
    }
}

вешали? Т. е. не на внешнюю функцию, а на локальную?

хорошо разбираться в IL?

На самом деле IL мы тут вообще не изучали. В основном здесь все от джита зависит

Ускоряем цикл foreach до for

Я говорю именно о том, чтобы повесить NoInlining на локальную функцию в последнем методе на линуксе. Кажется, тогда тоже будет так же быстро, как фор

Ускоряем цикл foreach до for

Интересно. В последнем методе (который WithLocal) у вас JIT решил использовать jmp вместо call-а:

...
jmp       near ptr Benchmarks.<ForeachWithRangeEnumeratorRawWithLocal>g__EnumerateItAll|14_0(Library.RangeEnumerator)
...

Поэтому итерация цикла в локальной функции выглядит как

M02_L00:
       mov       edi,[rbp-8]
       add       eax,edi
       add       edi,[rbp-0C]
       mov       [rbp-8],edi
       cmp       edi,esi
       jne       short M02_L00

А вот там, где у меня он разместил структуру на стеке, у вас он смог разместить ее в регистрах:

M00_L00:
       add       ebx,esi
       add       esi,edi
       cmp       esi,eax
       jne       short M00_L00

Видимо связано это с тем, что на линуксе джит может больше локальных переменных в регистры положить, но я не уверен, может тут есть эксперты?

А насчет jmp-а получается, что джит ошибся, и все-таки нужен был call. Интересно, а если вы добавите [MethodImpl(MethodImplOptions.NoInlining)] на локальную функцию, мы получим call?

Ускоряем цикл foreach до for

Вряд ли, Розлин не занимается оптимизациями. А вот RyuJIT с помощью Dynamic PGO имеет потенциал сделать магию, на ходу поменяв код, выгружая в регистры "горячие" локальные переменные.

Ускоряем цикл foreach до for

Ух ты. А кодген покажете? Там нужно в моем бенчмарке раскомментить DisassemblyDiagnoser, а потом посмотреть Artifacts папку

А еще я смотрю у вас Линукс, на нем может по-другому такие вещи работать (я на винде). Интересно посмотреть кодген!

Ускоряем цикл foreach до for

Проводил эксперименты на x64 шестом дотнете, все ссылки с шарплаба тоже настроены x64, хоть там пятый, разницы это не дало (в коде бенчмарка я закомментил аттрибут DisassemblyDiagnoser, с которым вы можете посмотреть именно тот асм, который гоняет бенчмарк)

Кстати, интересно то, что если поставить Default на шарплабе, т. е. 32-битный рантайм, то мы в последнем эксперименте получили бы:

    L0007: add eax, edx
    L0009: mov edx, [ebp+0x10]
    L000c: add edx, [ebp+0xc]
    L000f: mov [ebp+0x10], edx
    L0012: cmp edx, [ebp+8]
    L0015: jne short L0007

Так что... используйте 64 бита! :)

А еще можно попробовать включить Dynamic PGO, запустив бенчмарк так:

dotnet run -c release --envVars DOTNET_TieredPGO:1 DOTNET_ReadyToRun:0 DOTNET_TC_QuickJitForLoops:1

Но у меня получились те же результаты, что и в статье, так что я решил оставить это в комментарии.

Зачем я хотел попасть на Хабр

А сейчас как? Я не так давно здесь, но меня тоже пригласил участник

Информация

В рейтинге
Не участвует
Откуда
Москва, Москва и Московская обл., Россия
Зарегистрирован
Активность