Здравствуйте, void29091988, Вы писали:
V>Тестовые примеры, извлекающие данные из базы данных SqlServer дали еще большую разницу.
V>Это нормально? Мне казалось, что неуправляемый код должен давать преимущества в производительности... V>Или я где то ошибаюсь?
1. Попробуйте для начала писать эквивалентный код.
2. Основные преимущества в производительности дают те или иные архитектурные решения — от "управляемости" это зависит мало.
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re: Производительность управляемого и неуправляемого кода
Здравствуйте, void29091988, Вы писали:
V>Пишу 2 простейших приложения для записи в файл на управляемом(C#) и неуправляемом(C++) коде
Тесты не одинаковые: в сишной части отчёт времени начинается уже после открытия файлы, а в шарповой — до.
V>Это нормально? Мне казалось, что неуправляемый код должен давать преимущества в производительности... V>Или я где то ошибаюсь?
Как мерил?
Help will always be given at Hogwarts to those who ask for it.
Re[2]: Производительность управляемого и неуправляемого кода
TK>1. Попробуйте для начала писать эквивалентный код.
TK>2. Основные преимущества в производительности дают те или иные архитектурные решения — от "управляемости" это зависит мало.
1. Честно говоря, всеми силами пытался писать правильный и объективный код. Мои познания в С++ ограничиваются семестровым курсом по программированию, потому буду очень признателен если объясните где я совершил ошибки и что можно улучшить.
2. Так или иначе, но контроль типов во время исполнения должен хоть немного замедлять программу. А по результатам теста видим обратное, вот что собственно меня удивило.
Re[2]: Производительность управляемого и неуправляемого кода
Здравствуйте, _FRED_, Вы писали:
_FR>Тесты не одинаковые: в сишной части отчёт времени начинается уже после открытия файлы, а в шарповой — до. _FR>Как мерил?
1. Хорошо, но это значит, что сишная часть будет выполняться еще дольше(плюс время на открытие), а значит производительность еще меньше.
2. То есть? По времени выполнения...
Re[3]: Производительность управляемого и неуправляемого кода
Здравствуйте, void29091988, Вы писали:
_FR>>Тесты не одинаковые: в сишной части отчёт времени начинается уже после открытия файлы, а в шарповой — до. _FR>>Как мерил?
V>1. Хорошо, но это значит, что сишная часть будет выполняться еще дольше(плюс время на открытие), а значит производительность еще меньше.
Безполезно гадать
V>2. То есть? По времени выполнения...
В дебаг\релиз? Если релиз, то с какими опциями оптимизации С++? Из под студии запускал или нет? Нужно собрать релиз, подготовить NativeImage (для managed) и запускать "врукопашную".
Во-вторых, кажется, ты здесь меряешь, в основном, скорость IO (fprintf vs. Write) и не скорость выполнения.
Help will always be given at Hogwarts to those who ask for it.
Re[4]: Производительность управляемого и неуправляемого кода
Здравствуйте, _FRED_, Вы писали:
V>>2. То есть? По времени выполнения...
_FR>В дебаг\релиз? Если релиз, то с какими опциями оптимизации С++? Из под студии запускал или нет? Нужно собрать релиз, подготовить NativeImage (для managed) и запускать "врукопашную".
_FR>Во-вторых, кажется, ты здесь меряешь, в основном, скорость IO (fprintf vs. Write) и не скорость выполнения.
А, ну конечно компилил в релиз и запускал без студии. Оптимизация С++ — Maximize Speed(/O2);
После вашего сообщения полазил и поставил Favor Fast Code(/Ot) & Enable link-time code generation(/GL) & Enable Fiber-safe Optimization(/GT), что некоторым образом улучшило время выполнения — теперь оно отстает от управляемого кода всего на 7-8%.
Да, именно скорость IO, мне нужно улучшить производительность приложения во время работы с файловой системой(как вариант засчет неуправляемого кода), но что то пока не очень получается
Re[5]: Производительность управляемого и неуправляемого кода
Здравствуйте, void29091988, Вы писали:
V>Да, именно скорость IO, мне нужно улучшить производительность приложения во время работы с файловой системой(как вариант засчет неуправляемого кода), но что то пока не очень получается
Может лучше воспользоваться профайлером, и понять в чем проблема?
В любом случае управляемый код работает с файловой системой через WinAPI.
Re: Производительность управляемого и неуправляемого кода
Здравствуйте, void29091988, Вы писали:
V>Добрый день, уважаемые участники форума!
V> char* buffer = new char[10000]; V> for (int i = 0; i < 10000; i++) V> buffer[i] = 'D';
Строка не заканчивается нулем.
V> PerfCounter pc; V> pc.Start(); V> for (int i = 0; i < 10000; i++) V> fprintf(out, "%s", buffer);
А поэтому fprintf будет выводить 10000 букв D и неизвестно сколько чего еще, пока не найдет какой-то 0 или не получит AV.
И второе. Форматный ввод/вывод — не самое подходящее место для того, чтобы делать выводы о производительности.
With best regards
Pavel Dvorkin
Re[2]: Производительность управляемого и неуправляемого кода
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Здравствуйте, void29091988, Вы писали:
V>>Добрый день, уважаемые участники форума!
V>> char* buffer = new char[10000]; V>> for (int i = 0; i < 10000; i++) V>> buffer[i] = 'D';
PD>Строка не заканчивается нулем.
V>> PerfCounter pc; V>> pc.Start(); V>> for (int i = 0; i < 10000; i++) V>> fprintf(out, "%s", buffer);
PD>А поэтому fprintf будет выводить 10000 букв D и неизвестно сколько чего еще, пока не найдет какой-то 0 или не получит AV.
PD>И второе. Форматный ввод/вывод — не самое подходящее место для того, чтобы делать выводы о производительности.
Спасибо за идеи, давно на с++ ничего не писал — забыл уж) правда исправления:
char* buffer = new char[10000];
for (int i = 0; i < 9999; i++)
buffer[i] = 'D';
buffer[9999] = '\0';
и
for (int i = 0; i < 10000; i++)
fprintf(out, buffer);
дают точно такое же время выполнения
Re[3]: Производительность управляемого и неуправляемого кода
Здравствуйте, void29091988, Вы писали:
V>2. Так или иначе, но контроль типов во время исполнения должен хоть немного замедлять программу. А по результатам теста видим обратное, вот что собственно меня удивило.
Контроль типов и в том и другом случае происходит на этапе компиляции. В двоичном же коде всегда ясно с каким типом в данный момент времени идет работа.
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[5]: Производительность управляемого и неуправляемого кода
Здравствуйте, void29091988, Вы писали:
V>Да, именно скорость IO, мне нужно улучшить производительность приложения во время работы с файловой системой(как вариант засчет неуправляемого кода), но что то пока не очень получается
Смотрите в сторону буферизации. Если надо считать "именно" ввод/вывод то, после каждой операции надо делать Flush и писать данные фиксированными кусками. В противном случае, меряется эффективность работы внутреннего буфера.
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re: Производительность управляемого и неуправляемого кода
Здравствуйте, void29091988, Вы писали:
V>Это нормально? Мне казалось, что неуправляемый код должен давать преимущества в производительности... V>Или я где то ошибаюсь?
Подумай вот в каком направлении:
Когда ты компилиш программу в неуправляемый код, под какой процессор/версию ОС это компилится? Под тот, на котором прога будет выполняться, или под минимальную конфигурацию, для совместимости?
А если речь заходит об управляемом коде, то CLR делает из IL маш. код, заточенный под конкретное сочетание проца/ОС.
Т.е., если не отказываться от обратной совместимости, то на новых машинах управляемый код МОЖЕТ выполняться быстрее, чем неуправляемый.
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
Re: Производительность управляемого и неуправляемого кода
Здравствуйте, Александр Кузнецов, Вы писали:
АК>Здравствуйте, void29091988, Вы писали:
АК>Подумай вот в каком направлении: АК>Когда ты компилиш программу в неуправляемый код, под какой процессор/версию ОС это компилится? Под тот, на котором прога будет выполняться, или под минимальную конфигурацию, для совместимости? АК>А если речь заходит об управляемом коде, то CLR делает из IL маш. код, заточенный под конкретное сочетание проца/ОС.
АК>Т.е., если не отказываться от обратной совместимости, то на новых машинах управляемый код МОЖЕТ выполняться быстрее, чем неуправляемый.
блин, а ведь все правильно
Re[2]: Производительность управляемого и неуправляемого кода
Здравствуйте, Adriano, Вы писали:
A>Здравствуйте, void29091988, Вы писали:
A>что бы тесты были одинаковыми попробуй заменить на fwrite, т.к. fprintf, сам понимаешь, парсит формат и ищет в буфере признак конца строки
A>
A>int main(int argc, char* argv[])
A>{
A> FILE* out = fopen("C:\\1\\1.txt", "a");
A> char* buffer = new char[10000];
A> for (int i = 0; i < 10000; i++)
A> buffer[i] = 'D';
A> PerfCounter pc;
A> pc.Start();
A> for (int i = 0; i < 10000; i++)
A> fwrite(buffer, 10000, 1, out);
A> fclose(out);
A> float t = pc.Finish();
A> printf("%f", t);
A> return 1;
A>
такой вариант работает дольше
вот нашел вариант низкоуровневой реализации:
// открываем файлint fh = _open("file.dat",_O_RDWR | _O_BINARY);
if (fh == -1)
{
// или при необходимости создаём новый
fh = _creat("file.dat",_S_IREAD | _S_IWRITE);
if (fh == -1)
return 1;
}
// позиционируемся в конец файла
_lseek(fh,0,SEEK_END);
for (int i = 0; i < 10000; i++)
// добавляем новую структуру
_write(fh,&buffer,10000);
он работает быстрее первоначального варианта на с++ на 15-18% и быстрее варианта на управляемом коде на 4-5%
Re[4]: Производительность управляемого и неуправляемого кода
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Здравствуйте, void29091988, Вы писали:
V>>дают точно такое же время выполнения
PD>Могу лишь повторить
PD>Форматный ввод/вывод — не самое подходящее место для того, чтобы делать выводы о производительности.
PD>Ты не производительность C++ против C# мерял, а качество реализации fprintf против writer.Write. А это вообще-то, малосущественно.
спасибо, буду рыть ниже
Re[3]: Производительность управляемого и неуправляемого кода
Здравствуйте, void29091988, Вы писали:
АК>>Подумай вот в каком направлении: АК>>Когда ты компилиш программу в неуправляемый код, под какой процессор/версию ОС это компилится? Под тот, на котором прога будет выполняться, или под минимальную конфигурацию, для совместимости? АК>>А если речь заходит об управляемом коде, то CLR делает из IL маш. код, заточенный под конкретное сочетание проца/ОС.
АК>>Т.е., если не отказываться от обратной совместимости, то на новых машинах управляемый код МОЖЕТ выполняться быстрее, чем неуправляемый.
V>блин, а ведь все правильно
В теории.
Re[4]: Производительность управляемого и неуправляемого кода
Здравствуйте, hattab, Вы писали:
H>Здравствуйте, void29091988, Вы писали:
АК>>>Подумай вот в каком направлении: АК>>>Когда ты компилиш программу в неуправляемый код, под какой процессор/версию ОС это компилится? Под тот, на котором прога будет выполняться, или под минимальную конфигурацию, для совместимости? АК>>>А если речь заходит об управляемом коде, то CLR делает из IL маш. код, заточенный под конкретное сочетание проца/ОС.
АК>>>Т.е., если не отказываться от обратной совместимости, то на новых машинах управляемый код МОЖЕТ выполняться быстрее, чем неуправляемый.
V>>блин, а ведь все правильно
H>В теории.
Я, поэтому, и выделил "МОЖЕТ"
Ежику понятно, что при прочих равных неуправляемый код быстрее. Хотя все, как обычно, зависит от кривизны ручек и настроек компилятора.
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".