Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.95/43: Рейтинг темы: голосов - 43, средняя оценка - 4.95
70 / 64 / 5
Регистрация: 09.06.2012
Сообщений: 291
1

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

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

Author24 — интернет-сервис помощи студентам
И так здравствуйте,хотелось бы узнать почему в данном случае(то есть использование 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.07.2012, 07:23
Ответы с готовыми решениями:

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

В случае ошибки не прервать выполнение программы, а перейти к другой процедуре или к другому месту той же процедуры
Прошу помочь: в случае ошибки не прервать выполнение программы, а перейти к другой процедуре или к...

Оптимизация или увеличение скорости работы программы
Доброго времени суток, программисты! Буквально на днях столкнулся с проблемой, связанной с...

Замер скорости выполнения программы или оптимизация проекта
Всем привет, не знаете как лучше замерить скорость программы ?, чтобы можно было сравнить в какой...

30
5231 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,113
Записей в блоге: 2
26.07.2012, 17:32 21
Лучший ответ Сообщение было отмечено как решение

Решение

Author24 — интернет-сервис помощи студентам
Цитата Сообщение от diagon Посмотреть сообщение
На самом деле может за счет JIT.
На самом деле я не знаю, что такое JIT и я не знаю языков C#/Java etc (на Java писал курсовик, но не вникал, как это работает).
Но я вижу это так:
С++ транслируется в машинный код, в момент исполнения программы происходит следующее:
процессор:
- дайте инструкцию
инструкция:
- я готова, исполняй меня полностью
процессор:
- готово, дайте следующую инструкцию
и т.д.
С# транслируется в промежуточный код, который исполняется в виртуальной машине
VM:
- дайте инстукцию
инструкция:
- я готова, исполняй меня полностью
VM:
- сейчас я переведу тебя в машинный код
(пол часа спустя)
VM:
- процессор, ты меня слышишь?
процессор:
- да, слышу, че хотела?
VM:
- выполни эту команду
процессор:
- готово, давай следующую
VM:
- ща, у меня тут не все так просто...
и т.д.
исходя из этого представления, я ни когда не поверю, что управляемый код может быть быстрее.
Если я не прав, тогда объясните
8
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
26.07.2012, 17:55 22
Ну так а зачем так?
К чему это общение?
Я предпологал что это вызвано необходимость подсчета ссылок и управления ресурсами итп. - тогда не все так очевидно.
0
52 / 52 / 2
Регистрация: 09.03.2012
Сообщений: 101
26.07.2012, 18:00 23
Лучший ответ Сообщение было отмечено как решение

Решение

в чем заключается обмен информацией между программой и исполняющей средой и для чего это надо?
Всё несложно. Программа состоит из набора команд. Обычно команды идут сразу к процессору (неуправляемый код). А C# только просит исполняющую среду выполнить эти команды. Среда может сделать то, что просят или отказаться выполнять что-то небезопасное или сделать что-то другое, не уведомив об этом программу (например, вести логи). Также среда может когда ей вздумается приостановить выполнение потока команд (перевести программу в спящий режим) и влезть в данные приложения, поменять их или изменить сам программный код. Иногда это делается из другой программы, в том числе на языке C#.

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

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

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

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

исходя из чего следует, что не факт что водила на ламбо приедет первым...
0
Higher
1953 / 1219 / 120
Регистрация: 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
~ Эврика! ~
1256 / 1005 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
21.02.2013, 00:27 27
Вообще IL-код, в который компилируется C#, никогда не исполняется виртуальной машиной. Это Джава-код живёт в виртуальной песочнице, а IL существует только для того, чтобы быть скормленным JITу или NGENу. Исполняется уже полученный от них нативный код. (Пруф.)
0
5231 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,113
Записей в блоге: 2
21.02.2013, 09:04 28
Цитата Сообщение от diagon Посмотреть сообщение
В лучшем случае у вас будет gcc с -O3
ну это может быть так же и -msse4 (-msse4.1, -msse4.2), только в этом случае, конечно же, код не будет исполняться на процессорах, не поддерживающих sse4.
0
545 / 344 / 12
Регистрация: 05.11.2010
Сообщений: 1,076
Записей в блоге: 1
21.02.2013, 11:21 29
Так или иначе, проводить замеры на программе, которая каждую итерацию делает вывод в консоль - странная затея.
На вывод n-значного в лучшем случае время O(n), в то время как затраты на инкремент счетчика константны. Вы получили разницу в пределах погрешности, а производительность надо профилировщиком мерить.
0
4240 / 2937 / 687
Регистрация: 08.06.2007
Сообщений: 9,817
Записей в блоге: 4
21.02.2013, 11:32 30
Цитата Сообщение от Kastaneda Посмотреть сообщение
Не может код, выполняемый в виртуальной машине
Возможно вы спутали с Java. Код не выполняется в виртуальной машине. Просто он компилируется при первом запуске программы. (Первом запуске при данной загрузке операционной системы.) Причем компиляция происходит уже с учетом свойств реального процессора. Поэтому такой код, вообще говоря, будет работать никак уж не медленнее, если конечно отбросить время компиляции. При вторичном запуске этой программы компиляции уже не будет. Это, конечно, в идеале так задумано, а в реальности для правильного прохождения этого процесса может возникнуть много помех.
0
5231 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,113
Записей в блоге: 2
21.02.2013, 11:51 31
Цитата Сообщение от palva Посмотреть сообщение
Возможно вы спутали с Java. Код не выполняется в виртуальной машине
я ж писал
Цитата Сообщение от Kastaneda Посмотреть сообщение
На самом деле я не знаю, что такое JIT и я не знаю языков C#/Java etc
я не спутал, я просто этого не знаю В посте выше лишь предположение как оно работает.
0
21.02.2013, 11:51
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.02.2013, 11:51
Помогаю со студенческими работами здесь

Как закончить выполнение программы если матрица равна нулю или не существует?
Программа делает манипуляции с матрицей (уничтожает столбцы с одинаковыми значениями) и нужно...

Разница с скорости процессоров у Mac, производительность
Всем привет! Друзья, очень глупый вопрос хочу спросить несмотря на то что я связан с...

Есть ли существенная разница в скорости под веб?
Привет! Есть каталог товаров на сервер под веб. С каталогом работают на локальных машинах и...

Есть ли разница в скорости между Sata 3 и miniSata
Доброго времени суток . Собираюсь приобрести SSD в ноутбук , мне не нужен CD-привод и есть один...


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

Или воспользуйтесь поиском по форуму:
31
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru