Pull to refresh

Comments 5

Спасибо за статью, но есть ошибки.

В C# есть мощные инструменты для работы с параллелизмом, такие как многопоточность и параллельные коллекции. Создавая параллельные вычисления, вы можете эффективно использовать ресурсы многопроцессорных систем и снизить нагрузку на CPU.

Параллелизм - это не про снижение нагрузки на CPU, это про снижение времени выполнения задачи за счёт деления задачи на части и их парралельного выполнения - нагрузка на CPU при этом возрастает (используется максимальное количество ядер CPU, увеличиваются накладные расходы ОС на новые потоки threads), но время выполнения снижается.

Эффективное использование кэша CPU может значительно повысить производительность вашего приложения. При работе с большими объемами данных старайтесь минимизировать обращения к памяти и максимизировать локальность данных. Этого можно достичь путем кэширования часто используемых данных и оптимизации доступа к ним.

Кэшом CPU здесь даже и близко не пахнет, кэш CPU это настолько низкий уровень, что это реализовано в микрокоде ядра CPU, даже на уровне ядра ОС вы не можете этим кэшем управлять.

Есть спорные моменты по актуальности приведенных примеров.

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

Современные компиляторы хорошо оптимизируют код, поэтому с точки зрения чистого кода пример ок, а вот насчёт того что плохой код будет медленее - вопрос спорный, может да, может нет, зависит от того как отработала оптимизация.

Рекомендую книгу "Высокопроизводительный код на платформе .NET", тем кто действительно заинтересован в написании высокопроизводительного кода на C#.

Спасибо за дополнения. Да, с кешом я действительно что-то перемудрил) Ну и про компиляторы не спорю, здесь я больше отталкивался от реализации Unity, думаю да, базовые .Net компиляторы сейчас уже намного лучше такие кейсы обрабатывают

заметил, что на leetcode вынос вызова метода в цикле в переменную за пределами цикла реально ускоряет выполнение

А вот shrplab для обоих ваших вариантов с обходом цикла - и для "плохого" (где numbers[i]*numbers[i]) и для "хорошего" (где num*num) выдаёт одинаковый Asm Code.
Выходит, компилятор запросто справляется с такого рода оптимизациями...


https://sharplab.io/#v2:C4LghgzgtgPgAgJgIwFgBQcDMACR2DC2A3utmbjgJYB2w2AskgBQ3ADaAuttQK5QBGAUwBOEAJTFS5aa2wQ+2ALzYADAG50U6WQBmAe2HYWtbJSWq1p7AB5ufIaIB0AGUHUA5sAAWlygGo/CRI0bVC5BT9lXgERCDZKLgAqOxjReI4NELCAXy1tPOk4AHZwqEzpXKyyPKxTE3oEY3YuaIdxSSrtWXkoc3VNTul9QyarZXUrW1bYlzdPH1MAoIKw2WjzabSE8rDpHuxIlOxk6J3Qyt2VsmLSs+xK7KA==

Про TryGetValue автор статьи, взявшийся писать про оптимизацию использования CPU в C# не знает?

if (cache.ContainsKey(input)) { return cache[input]; }

Sign up to leave a comment.

Articles