Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
737 / 341 / 71
Регистрация: 10.06.2014
Сообщений: 2,357
1

Опции компиляторов для улучшения производительности

25.11.2016, 13:04. Просмотров 1028. Ответов 8
Метки нет (Все метки)

Провел простой тест на сравнение производительности между Си и С++. Тест заключается в поиске позиции подстроки.
Си при решении данной задачи имеет значительный отрыв.

Тесты на gcc:
тест на C++: http://rextester.com/NFM46901 absolute running time: 0.24 sec, cpu time: 0.15 sec
тест на Си: http://rextester.com/BZRIQE2644 absolute running time: 0.14 sec, cpu time: 0 sec


Что то мне подсказывает, компилятор Си понимает что искать одно и тоже 10000000 раз не имеет смысла т.к результат будет одинаков а С++ прокручивает все итерации и делает одно и то же. Предполагаю, что нужно включить какую то опцию компилятора что бы хотя бы приблизительно сравнять результат выполнения.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.11.2016, 13:04
Ответы с готовыми решениями:

Замечания/Улучшения для программы (Сборка сортировок)
Здравствуйте! имеется данный код: #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include...

Добавление компиляторов и отладчиков с++ для windows 8 x64
Здравствуйте господа программисты, у меня такой вопрос: Решил изучать с++ поставил себе IDE...

Нужны пояснения насчет компиляторов для разных ОС
Всем привет ребят! Есть несколько вопросов: 1) Существуют различные компиляторы (к примеру на...

Одинаковы ли символьные коды для всех систем/компиляторов?
То есть будут ли операции типа: char c = 'A'; c += 1; cout << int(c); Всегда давать одинаковый...

8
Форумчанин
Эксперт CЭксперт С++
8160 / 5008 / 1436
Регистрация: 29.11.2010
Сообщений: 13,458
25.11.2016, 13:11 2
Думаю, что вся фишка в том, что С понимает, что ищет всего один символ.
С++ http://rextester.com/JCCCY79542
Compilation time: 0.32 sec, absolute running time: 0.14 sec, cpu time: 0.08 sec, memory peak: 3 Mb, absolute service time: 0,46 sec
С http://rextester.com/WYIU87742
Compilation time: 0.12 sec, absolute running time: 0.14 sec, cpu time: 0 sec, memory peak: 3 Mb, absolute service time: 0,26 sec
Как видим, время рантайм у С не поменялось, а вот С++ сравнял позиции.
1
737 / 341 / 71
Регистрация: 10.06.2014
Сообщений: 2,357
25.11.2016, 13:27  [ТС] 3
Цитата Сообщение от MrGluck Посмотреть сообщение
Думаю, что вся фишка в том, что С понимает, что ищет всего один символ.
Спасибо, с одинарными кавычками поиск получился действительно быстрее. Но как быть если нужно найти несколько символов? Провел тест, добавил пару символов для си и на плюсах, плюсы снова начали тормозить, а у си время поиска не изменилось

http://rextester.com/CZXB73312 Си
http://rextester.com/BLVM51744 Плюсы

Добавлено через 9 минут
И ещё заметил особенность, когда искомых символов нет в строке то поиск становится ещё более тормознутым на плюсах
А на Си нет
0
Форумчанин
Эксперт CЭксперт С++
8160 / 5008 / 1436
Регистрация: 29.11.2010
Сообщений: 13,458
25.11.2016, 13:42 4
Лучший ответ Сообщение было отмечено Undisputed как решение

Решение

Цитата Сообщение от sys_beginner Посмотреть сообщение
добавил пару символов для си и на плюсах, плюсы снова начали тормозить
Возможно, компилятор приводит сишную строку к константе времени компиляции и делает соответствующие оптимизации, а у С++ std::string сделать константой времени компиляции не выйдет.

Добавлено через 4 минуты
Как я и говорил: http://rextester.com/HTBBG31924
С++17 support

Добавлено через 44 секунды
Compilation time: 0.32 sec, absolute running time: 0.14 sec, cpu time: 0.1 sec, memory peak: 3 Mb, absolute service time: 0,46 sec
res

Добавлено через 1 минуту
Дабы не ходить по ссылкам.
Код на С:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//gcc 4.9.3
 
#include <stdio.h>
#include <string.h>
   
int main(void)
{
    char *str = "Hello, world!! Hello all!";
    char *result;
    int pos = 0;
    for (int i = 0; i < 10000000; i++) {
        result = strstr(str, "!!");
        if (result) {
            pos = result - str;
        }
    }
    printf("%d", pos);
    return 0;
}
Код на С++
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//g++  4.9.3
 
#include <iostream>
#include <experimental/string_view>
 
int main()
{
    const std::experimental::string_view s = "Hello, world!! Hello all!";
    int pos;
    for (int i = 0; i < 10000000; i++) {
        pos = s.find("!!");
    }
    std::cout << pos;
}
1
737 / 341 / 71
Регистрация: 10.06.2014
Сообщений: 2,357
25.11.2016, 13:48  [ТС] 5
MrGluck,
Спасибо! Жаль только нормально работающий вариант - экспериментальный

Добавлено через 1 минуту
И ещё нет методов вроде capacity
0
Форумчанин
Эксперт CЭксперт С++
8160 / 5008 / 1436
Регистрация: 29.11.2010
Сообщений: 13,458
25.11.2016, 13:54 6
Цитата Сообщение от sys_beginner Посмотреть сообщение
Спасибо! Жаль только нормально работающий вариант - экспериментальный
Ну так это часть С++17. С 99% вероятностью, будет в наступающем году.
0
737 / 341 / 71
Регистрация: 10.06.2014
Сообщений: 2,357
25.11.2016, 14:00  [ТС] 7
Цитата Сообщение от MrGluck Посмотреть сообщение
Ну так это часть С++17. С 99% вероятностью, будет в наступающем году.
Будем ждать Только похоже это урезанная версия string, теряем в гибкости... Посмотрел, там нет метода capacity/reserve
0
Форумчанин
Эксперт CЭксперт С++
8160 / 5008 / 1436
Регистрация: 29.11.2010
Сообщений: 13,458
25.11.2016, 14:12 8
Цитата Сообщение от sys_beginner Посмотреть сообщение
Посмотрел, там нет метода capacity/reserve
Так это же constexpr. Если нужен capacity - скорее всего мы работаем уже не с данными известными во время компиляции. А иначе бы уже инициализировали строку. необходимая память под данные там высчитывается самостоятельно. capacity нужно для расширения контейнера, а это уже работа с динамической памятью.
1
737 / 341 / 71
Регистрация: 10.06.2014
Сообщений: 2,357
25.11.2016, 15:07  [ТС] 9
Цитата Сообщение от MrGluck Посмотреть сообщение
Так это же constexpr. Если нужен capacity - скорее всего мы работаем уже не с данными известными во время компиляции.
Ясно, спасибо. Просто заранее может понадобится выделить большой кусок памяти под строку(один раз) и перезаписывать когда есть необходимость другими строками разного размера но не более максимального. Но это да, уже не константа с точки зрения данных. Но константа с точки зрения фиксированного размера строки
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.11.2016, 15:07

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Возможно ли применение сетей Петри для улучшения качества кода и реверс инжинеринга?
Т.к. в ветке &quot;С++ для экспертов&quot; у меня нет прав на создание сообщения и оно не совсем связано с...

Программа для улучшения производительности системы
На ХР пользовался Norton Utilities. Для 8 не могу найти NU на русском языке. Где скачать NU для 8...

Оптимизации кода для улучшения производительности
Почему VB.net такой тормозной по сравнению с VC++ ?! риторический вопрос :) Какие вообще есть...

Изменить цветовую схему для улучшения производительности?
Почему у меня порой (не часто) выскакивает такое окно? ОС -Win7x64, i5-6600, GTX 960, ОЗУ 16Гб....

Подскажите что поменять для улучшения производительности
Помогите пожалуйста кто разбирается, что можно для этой материнки максимально подобрать? Подозреваю...

ЧТо следует изменить в Биосе для улучшения производительности
Дело в общем в чем)) У меня вполне себе стандартный(Средненький компьютер) Athlon...


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

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

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