Почему.NET использует так много ЦП, действительно ли это - проблема?

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

РЕДАКТИРОВАНИЕ: Как отмечено в комментариях, если Вы можете использование абстракции более высокого уровня, это является большим. И если Вы делаете блокировка использования, будьте осторожны с нею - документ, что Вы ожидаете быть заблокированными, где, и получают/выпускают блокировки в течение максимально короткого периода (больше для правильности, чем производительность). Постарайтесь не звонить в неизвестный код при содержании блокировки, избегайте вложенных блокировок и т.д.

В.NET 4 существует партия [еще 113] поддержка высокоуровневых абстракций (включая код без блокировок). Так или иначе я все еще не рекомендовал бы использовать синхронизируемые обертки.

5
задан Anthony D 16 September 2009 в 13:17
поделиться

5 ответов

Насколько вы знакомы с C # и .NET? Если вы просто переносите устаревший код, сохраняя идиомы C ++, меня нисколько не удивляет, что это не так. Дословный перенос приложений с одной платформы на другую почти никогда не бывает хорошей идеей. (Конечно, вы не сказали, что определенно сделали это.) Кроме того, если вы опытные разработчики C ++, но начинающие разработчики .NET, вы должны ожидать, что ваш код будет выполнять , как если бы вы ' новичков на платформе.

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

. NET обычно будет тяжелее с точки зрения памяти, чем приложение C ++, но должно быть по крайней мере сопоставимым с точки зрения скорости для большинства задач. Использование 50 МБ вместо 9 МБ - это больше, чем я ожидал, но я бы не стал слишком беспокоиться.

Как память, так и производительность процессора следует исследовать с помощью хорошего профилировщика . Я могу порекомендовать JetBrains dotTrace Profiler , но есть много других.

И память, и производительность процессора следует исследовать с помощью хорошего профилировщика. Я могу порекомендовать JetBrains dotTrace Profiler , но есть много других.

И память, и производительность процессора следует исследовать с помощью хорошего профилировщика. Я могу порекомендовать JetBrains dotTrace Profiler , но есть много других.

17
ответ дан 18 December 2019 в 06:35
поделиться

AFAIK there is litte difference between (int)datarow["Index"] and ConvertTo.Int32(datarow["Index"]). However there is a big difference if you use stream mode data readers:

int orderIndex = <order of Index column in projection list>;
using (OdbcDataReader rdr = cmd.ExecuteReader(CommandBehavior.SequentialAccess))
{
  int Index = rdr.GetInt32(orderIndex);
}

The SeqentialAccess command behavior is the fastes way to process SQL results, because it does eliminate extra caching needed for random access.

A second notice is that is seems you're using Data sets. Data sets are easy to use, but they are very very far from what anyone can call 'fast'. With data sets you are basically running an in memory storage engine (I think is based on Rushmore). If you want to squeeze every CPU cycle and all the 1s from every bit of RAM, then you'll have to use leaner components (eg. raw arrays of structs instead of Datasets and DataTables).

When you compare apples to apples CLR can hold its ground against native code. IL code can be nativized at deployment time with NGEN. Typical CLR overheads like bounds checks can be avoided . GC pre-emption 'pause' happens only if you're careless with your allocation (just because you have GC doesn't mean you should allocate left and right). And CLR actually has some aces up its sleve when it comes to memory layout since it can rearange object in memory to fit access patterns and improve TLB and L2 locality.

BTW, if you think the debate 'C++ can run circles around C#' is something new, I remember a time when C could run circles around C++ ('virtual calls are impossibly slow' they were saying) and I hear there was a time assembly was running circles around C.

6
ответ дан 18 December 2019 в 06:35
поделиться

Вы должны увидеть некоторое увеличение загрузки ЦП. От 3% до 50% - это слишком много, что это за код?

Объем памяти - это просто неизбежная цена. Любые вещи размером от 30 до 50 МБ для приложения .NET - это нормально. Как правило, фактическое использование памяти вашим .NET-приложением очень мало, но есть значительные накладные расходы времени выполнения, которых вы не можете избежать (это единовременные затраты, но ...

1
ответ дан 18 December 2019 в 06:35
поделиться

Я бы сказал, что использование памяти, вероятно, соответствует норме, а использование ЦП - нет.

Похоже, у вас есть поток, который не работает.

0
ответ дан 18 December 2019 в 06:35
поделиться

Я могу придумать несколько предположений:

1) Память - C ++ не имеет управляемой памяти. Таким образом, он освобождает память постепенно и в оптимальное время (если хорошо запрограммировано).

При использовании управляемой памяти программа будет в основном «пропускать» память до тех пор, пока она не решит выполнить сборку мусора. Время, вероятно, зависит от того, сколько памяти было выделено процессу. Вероятно, есть способ изменить поведение по умолчанию, но меньший размер памяти означает, что сборка мусора происходит раньше и чаще, что влияет на время обработки. Если выделено достаточно memo9ry, то вызов gc может и не потребоваться.

2) Программа выполняется одновременно или реже? Если он использует в 5 раз больше мощности процессора, но завершает работу за 1/5 времени, то используемый процессор в основном эквивалентен.

3) Да,.

0
ответ дан 18 December 2019 в 06:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: