Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 31, средняя оценка - 4.94
xADMIRALx
67 / 61 / 1
Регистрация: 09.06.2012
Сообщений: 291
#1

Разница в скорости выполнение программы C++ или C# - C++

25.07.2012, 07:23. Просмотров 4432. Ответов 30
Метки нет (Все метки)

И так здравствуйте,хотелось бы узнать почему в данном случае(то есть использование stl) c++ медленнее c# ,запускаю из релиза

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <locale>
 
 
int main()
{
    setlocale(LC_ALL,".1251");
    time_t f = clock();
    for (int i = 0; i < 100000;i++)
        printf("%d\n",i);
 
    printf("Программа выполнялась : %d sek\n",(clock() - f) / CLOCKS_PER_SEC);
 
 
 
 
    system("PAUSE");
    return 0;
 
}
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace test_in_cshape
{
    class Program
    {
        static void Main(string[] args)
        {
            DateTime start = DateTime.Now;
           
            for (int i = 0; i < 100000; i++)
            {
                Console.WriteLine("{0}",i);
            }
            DateTime finish = DateTime.Now;
            Console.WriteLine("Программа выполнялась : {0}", finish.Second - start.Second);
            Console.ReadLine();
 
        }
    }
}
Запускаю одновременно 2 программы c# показывает 10 сек,с++ 14 сек.

если не в том разделе создал перенесите пожалуйста в нужный
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.07.2012, 07:23
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Разница в скорости выполнение программы C++ или C# (C++):

Разница в скорости выполнения, итераторы - C++
Википедия for (ContainerType::iterator it = C.begin(),end = C.end(); it != end; ++it) { std::cout &lt;&lt; *it &lt;&lt; std::endl; } ...

Измерение скорости работы блока программы - C++
Как можно протестировать на скорость работы отдельный блок программы? Пример: замер скорости class_one.function1(). int main() {...

Как сгенерировать 100 чисел, разница чисел должна быть или -1 или +1 - C++
Как сгенерировать 100 чисел, разница чисел должна быть или -1 или +1 (например: 0 -1 0 1 2 1 0 1 0 -1 -2 ....) и если...

Сравнение скорости, условие или операция - C++
Подскажите, что быстрее сравнить 2 переменные if(x != y){ x = y + 1; } Или каждый раз расчитывать x = y + 1;

Выполнение программы - C++
Привет, я только начал изучать C++. По книге &quot;Язык программирования С&quot; Кернигана Б., Ритчи Д. Первая программа, которую я пытался...

Visual C++ или C++ Builder в чем разница? - C++
Учу С++ for 21 days. Ну вопрос такой есть несколько версии С++. Например Visual C++ или C++ Builder в чем разница? и какую рекомендуетье?...

30
diagon
Higher
1930 / 1196 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
25.07.2012, 23:05 #16
Цитата Сообщение от Jupiter Посмотреть сообщение
и чё? эти микрооптимизации никому не нужны, что-то я не припомню кардинальных изменений со времен SSE, MMX, etc
Однако они могут компенсировать тот факт, что с++ исполняется напрямую процессором, а C# виртуальной машиной.

Другое дело, что С++ как язык очень сильно оптимизирован(move semantics, шаблоны, etc), и в более серьезных приложениях шарпу за ним не угнаться.
1
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
26.07.2012, 07:27 #17
Спасибо, это интересно ; )
Но я так и не понял, что же такое "управляемый код" ;<

p.s И да, автор, раз вник, то расскажи и нам ; (
0
Avazart
Нарушитель
Эксперт С++
7232 / 5404 / 293
Регистрация: 10.12.2010
Сообщений: 23,952
Записей в блоге: 17
26.07.2012, 08:21 #18
Управля́емый код (англ. managed code) — термин, введённый Microsoft для обозначения кода программы, исполняемой под «управлением» виртуальной машины .NET[1][2] — Common Language Runtime. При этом обычный машинный код называется неуправля́емым кодом (англ. unmanaged code).

Слово управляемый здесь относится к методу обмена информацией между программой и исполняющей средой. Оно означает, что в любой точке исполнения управляющая среда может приостановить исполнение и получить информацию, специфичную для текущего состояния. Необходимая для этого информация представлена в управляемом коде на языке Intermediate Language и в связанных с этим кодом метаданных.

С формальной точки зрения управляемым кодом является любой программный код, исполняемый в среде отладчика.
http://ru.wikipedia.org/wiki/%D0%A3%...BA%D0%BE%D0%B4

Для меня лично непонятно в чем заключается обмен информацией между программой и исполняющей средой и для чего это надо?
0
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
26.07.2012, 12:31 #19
Avazart, собственно, как я уже говорил ранее, я читал вики и всё равно я.. глуп ; (
0
Avazart
Нарушитель
Эксперт С++
7232 / 5404 / 293
Регистрация: 10.12.2010
Сообщений: 23,952
Записей в блоге: 17
26.07.2012, 12:42 #20
Ну так я к чему и привел- что непонятен сам механизм.
0
Kastaneda
Нарушитель
Эксперт С++
4676 / 2880 / 234
Регистрация: 12.12.2009
Сообщений: 7,314
Записей в блоге: 2
Завершенные тесты: 1
26.07.2012, 17:32 #21
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от diagon Посмотреть сообщение
На самом деле может за счет JIT.
На самом деле я не знаю, что такое JIT и я не знаю языков C#/Java etc (на Java писал курсовик, но не вникал, как это работает).
Но я вижу это так:
С++ транслируется в машинный код, в момент исполнения программы происходит следующее:
процессор:
- дайте инструкцию
инструкция:
- я готова, исполняй меня полностью
процессор:
- готово, дайте следующую инструкцию
и т.д.
С# транслируется в промежуточный код, который исполняется в виртуальной машине
VM:
- дайте инстукцию
инструкция:
- я готова, исполняй меня полностью
VM:
- сейчас я переведу тебя в машинный код
(пол часа спустя)
VM:
- процессор, ты меня слышишь?
процессор:
- да, слышу, че хотела?
VM:
- выполни эту команду
процессор:
- готово, давай следующую
VM:
- ща, у меня тут не все так просто...
и т.д.
исходя из этого представления, я ни когда не поверю, что управляемый код может быть быстрее.
Если я не прав, тогда объясните
8
Avazart
Нарушитель
Эксперт С++
7232 / 5404 / 293
Регистрация: 10.12.2010
Сообщений: 23,952
Записей в блоге: 17
26.07.2012, 17:55 #22
Ну так а зачем так?
К чему это общение?
Я предпологал что это вызвано необходимость подсчета ссылок и управления ресурсами итп. - тогда не все так очевидно.
0
modwind
52 / 52 / 1
Регистрация: 09.03.2012
Сообщений: 101
26.07.2012, 18:00 #23
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
в чем заключается обмен информацией между программой и исполняющей средой и для чего это надо?
Всё несложно. Программа состоит из набора команд. Обычно команды идут сразу к процессору (неуправляемый код). А C# только просит исполняющую среду выполнить эти команды. Среда может сделать то, что просят или отказаться выполнять что-то небезопасное или сделать что-то другое, не уведомив об этом программу (например, вести логи). Также среда может когда ей вздумается приостановить выполнение потока команд (перевести программу в спящий режим) и влезть в данные приложения, поменять их или изменить сам программный код. Иногда это делается из другой программы, в том числе на языке C#.

Даже неуправляемый код не до конца свободен. Его выполнение частично контролирует операционная система (в основном это доступ к определённым ресурсам). Наименее контролируется код, выполняемый в режиме ядра, поэтому в драйверах и возникают синие экраны смерти.

Добавлено через 1 минуту
Зачем это нужно? Чтобы программа одинаково выполнялась на любом устройстве, независимо от железа и операционной системы. И ещё для обеспечения большей безопасности.
3
Jupiter
Каратель
Эксперт С++
6559 / 3980 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
26.07.2012, 18:03 #24
Цитата Сообщение от Avazart Посмотреть сообщение
Ну так а зачем так?
К чему это общение?
запуск программы без перекомпеляции на разных платформах
Цитата Сообщение от Avazart Посмотреть сообщение
Я предпологал что это вызвано необходимость подсчета ссылок и управления ресурсами итп.
именно, плюс такие плюшки как рефлексия
but on the other hand:
1) сегодня не так много платформ как хотелось бы
2) интел поддерживает совместимось ассемблера начиная с Intel 80*
2
hepper
Кодогенератор
196 / 196 / 35
Регистрация: 15.06.2011
Сообщений: 789
Завершенные тесты: 3
20.02.2013, 23:18 #25
Цитата Сообщение от Kastaneda Посмотреть сообщение
С# транслируется в промежуточный код, который исполняется в виртуальной машине
Кликните здесь для просмотра всего текста
VM:
- дайте инстукцию
инструкция:
- я готова, исполняй меня полностью
VM:
- сейчас я переведу тебя в машинный код
(пол часа спустя)
VM:
- процессор, ты меня слышишь?
процессор:
- да, слышу, че хотела?
VM:
- выполни эту команду
процессор:
- готово, давай следующую
VM:
- ща, у меня тут не все так просто...
и т.д.

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

подъехали два водилы к городу, один на ламборджини (С++) второй на ТАЗике (c#),
вот первый (с++) знает, что по городу максимальное ограничение скорости 60 км/ч, и прет 60 нигде не сбавляя хода, ни на поворотах ни на светафорах... ламбо позволяет.
второй (с#) едет попроще, на поворотах притормаживает, гдето на светафорах даже останавливается, но видит что в некоторых местах городских улиц стоит знак повышения ограничения скорости на 80, 100, 110 км/ч и прет на тех участках на максимально допустимых скоростях...

исходя из чего следует, что не факт что водила на ламбо приедет первым...
0
diagon
Higher
1930 / 1196 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
20.02.2013, 23:38 #26
Ну и мое объяснение :)
Цитата Сообщение от Kastaneda Посмотреть сообщение
Если я не прав, тогда объясните
Когда вы пишите программу на нативном коде, вы не можете использовать все возможности современных процессоров. И, допустим, в вашей программе есть векторизируемые циклы (а они достаточно часто встречаются). В лучшем случае у вас будет gcc с -O3, который автоматически векторизирует этот цикл с использованием SSE2.
В случае же с байткодом виртуальная машина знает, на какой платформе исполняется программа, и транслирует байткод в нативный код, при этом используя все возможности процессора. То бишь при попадании на современные процессоры ваша программа будет использовать AVX для векторизации. Т.е. допустим, вы на каждой итерации цикла обрабатывали 1 байт массива, но в случае с AVX вы будете обрабатывать 32 байта за итерацию. Это дает ощутимый прирост к производительности.
P.S. C# компилируется не только в байткод(его вроде как вполне можно скомпилировать в .exe), и с++ тоже может компилироваться не только в нативный код(осталось лишь дождаться нормальной поддержки винды llvm'ом).
1
OhMyGodSoLong
~ Эврика! ~
1244 / 993 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
21.02.2013, 00:27 #27
Вообще IL-код, в который компилируется C#, никогда не исполняется виртуальной машиной. Это Джава-код живёт в виртуальной песочнице, а IL существует только для того, чтобы быть скормленным JITу или NGENу. Исполняется уже полученный от них нативный код. (Пруф.)
0
Kastaneda
Нарушитель
Эксперт С++
4676 / 2880 / 234
Регистрация: 12.12.2009
Сообщений: 7,314
Записей в блоге: 2
Завершенные тесты: 1
21.02.2013, 09:04 #28
Цитата Сообщение от diagon Посмотреть сообщение
В лучшем случае у вас будет gcc с -O3
ну это может быть так же и -msse4 (-msse4.1, -msse4.2), только в этом случае, конечно же, код не будет исполняться на процессорах, не поддерживающих sse4.
0
Герц
524 / 341 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
21.02.2013, 11:21 #29
Так или иначе, проводить замеры на программе, которая каждую итерацию делает вывод в консоль - странная затея.
На вывод n-значного в лучшем случае время O(n), в то время как затраты на инкремент счетчика константны. Вы получили разницу в пределах погрешности, а производительность надо профилировщиком мерить.
0
palva
2630 / 1857 / 268
Регистрация: 08.06.2007
Сообщений: 7,102
Записей в блоге: 4
21.02.2013, 11:32 #30
Цитата Сообщение от Kastaneda Посмотреть сообщение
Не может код, выполняемый в виртуальной машине
Возможно вы спутали с Java. Код не выполняется в виртуальной машине. Просто он компилируется при первом запуске программы. (Первом запуске при данной загрузке операционной системы.) Причем компиляция происходит уже с учетом свойств реального процессора. Поэтому такой код, вообще говоря, будет работать никак уж не медленнее, если конечно отбросить время компиляции. При вторичном запуске этой программы компиляции уже не будет. Это, конечно, в идеале так задумано, а в реальности для правильного прохождения этого процесса может возникнуть много помех.
0
21.02.2013, 11:32
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.02.2013, 11:32
Привет! Вот еще темы с ответами:

Выполнение программы в облаке - C++
Доброго времени суток. Возник вопрос- могу ли я, обычный пользователь ПК, отправить свою программу (exe-файл) куда-то в облако для...

Зациклить выполнение программы - C++
Помогите,как сделать чтобы при завершении программы, при нажатии определенной кнопки она начинала работать снова. Т.е. чтобы не...

Неправильное выполнение программы - C++
Задание: В одномерном массиве, состоящем из n вещественных элементов, вычислить: • номер минимального элемента массива; • сумму...

Некорректное выполнение программы - C++
Суть проблемы: при выполнении программы выдаются корявые значения (-1.INF). Понимаю, что в программе где-то допущена ошибка, но сам уже...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru