2009-09-15 4 views
5

(Это должно было быть вообще гипотетический вопрос, мне ныть, что .NET была свинья и выпрашивая причинам. Это не было на самом деле имел в виду, что вопрос о моем конкретном приложении.)Почему .NET использует так много CPU, это проблема?

В настоящее время я переписывая старый C++-код на C#. Мы переносим все устаревшие приложения. У меня есть приложения на C++, которые используют MAX 3% CPU. В основном они не используют их. Затем я беру код, копирую и вставляю, а затем переформатирую синтаксис C# и библиотеки .NET и BAM! 50% процессор. В чем причина этого? Сначала я думал, что это JIT, но даже после того, как каждый путь кода был упражнением, и все это было JIT ed, та же проблема.

Я также заметил, что огромная память увеличивается. Приложения, на которых выполнялась полная загрузка 9 МБ, теперь начинаются с 10 МБ и работают со скоростью 50 МБ. Я понимаю, что оборудование дешево, но я хочу понять, что вызывает это. Является ли это причиной тревоги, или это просто такая свинья?

Update 1 Ответ на SKEET

Я знаком с C#. Я меняю вещи на Linq и так далее. Обычно я беру код и уменьшаю количество строк и т. Д. Не могли бы вы привести еще несколько примеров того, что C++ человек делает неправильно в .NET?

Update 2

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

У этого есть поток, который использует и драйвер ODBC для получения данных от парадокса db. Затем он использует Linq, чтобы преобразовать его в SQL db и опубликовать его. Я запускаю его через профилировщик ANTS, и кажется, что заполнение набора данных занимает больше всего времени. Затем следует проводка Linq. Я знаю, что некоторые из моих областей - использование рефлексии, но я не вижу, как делать то, что мне нужно, чтобы это исключить. Я планирую изменить свою строку на строковые сборщики. Есть ли разница между этими двумя?

(int)datarow["Index"] 

и

ConvertTo.Int32(datarow["Index"]) 

Я изменил все конкатенации в строках формата. Это не уменьшилось на голове. Кто-нибудь знает разницу между устройством чтения данных и адаптером данных и наборами данных?

+9

Вместо теоретических примеров вы можете лучше использовать профилировщик, чтобы узнать, почему/где ваше приложение тратит CPU. – ChrisW

+1

Похоже, что это может быть взаимодействие с ODBC. Есть ли «родной» драйвер .NET Paradox? –

+3

50% -ый процессор в течение долгого времени? Для какой задачи? В мини-тестах с интенсивным процессором, которые я изучал, C++ был быстрее, чем C#, но не сильно. В каждом случае я насыщал процессор, чтобы получить максимальную пропускную способность. – Cheeso

ответ

17

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

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

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

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

+0

Не могли бы вы привести еще несколько примеров? –

+0

Как то, что может быть новичком .NET, что может сделать парень из C++? –

+3

Примеры чего? Не зная ничего о вашем приложении, было бы очень сложно угадать, где могут быть узкие места. Даже использование LINQ может привести к узкому месту, если вы не будете осторожны. Я бы действительно пошел на профайлер - все остальное будет просто догадкой. –

0

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

Похоже, что у вас есть нить, которая не уступает.

1

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

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

0

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

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

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

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

3) Да, .NET, вероятно, свинья

+1

Если вы звоните .Net свиньи ваше имя очень подходит –

+0

Не получилось :) Лично я не вижу ничего плохого в том, чтобы быть «свинью» в наши дни .. Мне нравится VB .NET, это лучшая среда программирования С тех пор я занимаюсь интерлиссом в конце 80-х, и его поддерживает инфраструктура, которая может использоваться для доставки коммерческих приложений, а не просто классных демонстраций/исследований/доказательств концепции. Я считаю, что основным уроком для Java является «сейчас хорошо быть свинью. У нас достаточно вычислительной мощности», которую Microsoft придумала и переделала, на мой взгляд, намного лучше (лучше IDE, лучше эффективный сгенерированный код). Это свинья, но очень БЫСТРАЯ свинья :) –

6

AFAIK есть Литт разница между (int)datarow["Index"] и ConvertTo.Int32(datarow["Index"]). Однако есть большая разница, если вы используете поток данных читателей Режим:

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

Поведение команды SeqentialAccess является fastes способ обработки SQL-результатов, так как это устранить дополнительное кэширование, необходимое для произвольного доступа.

Второе уведомление заключается в том, что, похоже, вы используете наборы данных. Наборы данных просты в использовании, но они очень далеки от того, что любой может назвать «быстрым». С наборами данных вы в основном работаете с механизмом хранения памяти (я думаю, что он основан на Rushmore). Если вы хотите сжать каждый цикл ЦП и все 1 с каждого бита ОЗУ, вам придется использовать более компактные компоненты (например, необработанные массивы структур вместо наборов данных и DataTables).

Когда вы сравниваете яблоки с яблоками, CLR может удерживать землю от нативного кода. Код IL может быть включен во время развертывания с NGEN. Типичные накладные расходы CLR, такие как bounds checks can be avoided. GC pre-emption «pause» происходит только в том случае, если вы небрежны с вашим распределением (просто потому, что у вас есть GC, это не значит, что вы должны выделить слева и справа). И у CLR на самом деле есть несколько тузов, которые приходят, когда речь заходит о макете памяти, поскольку она может перенастроить объект в памяти, чтобы соответствовать шаблонам доступа и улучшить локальную сеть TLB и L2.

BTW, если вы считаете, что дискуссия «C++ может запускать круги вокруг C#» - это что-то новое, я помню время, когда C мог запускать круги вокруг C++ («виртуальные звонки невероятно медленны», как они говорили), и я слышу там была сборка времени, на которой были круги вокруг C.

Смежные вопросы