Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
3 / 3 / 1
Регистрация: 04.02.2011
Сообщений: 37

STL vs C в linux

25.12.2012, 12:55. Показов 2304. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Нет специализированного раздела, потому постим здесь, т.к. компилируем в linux.

Недавно на хабре наткнулся на пост годовой давности.
http://habrahabr.ru/post/131598/
в комментариях написано, что под stl на деле получаются более быстрые приложения. Вот якобы быстрый код на STL:
C++
1
2
3
4
5
6
7
8
9
10
11
12
struct hasher: public std::unary_function< const char, void > {
uint32 &res;
inline hasher(uint32 &inp): res(inp){};
inline void operator()( const char c ){res = 31*res + c;};
};
 
uint32 good_hash_stl(const std::string& str) {
uint32 h = 0;
for_each (str.begin(),str.end(), hasher(h));
 
return h;
}
Скомпилировал, замерил скорость. Все равно получилось что вариант хэширования на C в 5 раз быстрее. Что я могу неправильно делать?
Компилирую с помощью gcc с библиотекой lstdc++
Может stl действительно быстрее ( в чем я сомневаюсь) и я чего-то не знаю.
Профилирование выдает, что только на разыменовывание указателя уходит времени в stl столько, сколько в С на вычисление хэш-кода.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.12.2012, 12:55
Ответы с готовыми решениями:

Ошибка Kernel driver not installed (rc=-1908) linux в VirtualBox (Linux Mint)
При попытке запустить ВМ в VB вылетает ошибка Kernel driver not installed (rc=-1908)Смотрел в интернете - пишут, что нужно отключить в BIOS...

[Mono] Подскажите ide c# под linux чтобы компилировался файл для linux
Подскажите ide c# под linux чтобы компилировался файл для linux не как в monodevelop

Разметка в Linux жесткого диска для дуалбут MS-DOS и Linux
У меня, значит, на стационарном старичке стоит жесткий на 2 Тб. Win XP такие цифры не знает, а вот видит ли такой обьем linux? ...

10
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
25.12.2012, 16:30
crastin,
разыменовывание указателя уходит времени в stl
Простите, что? С определенно быстрее будет, если правильно на нем писать, однако намного менее удобнее.
0
387 / 151 / 16
Регистрация: 12.05.2011
Сообщений: 450
25.12.2012, 19:59
crastin, вы в курсе, что то, что вы привели даже не скомпилируется?
не говоря о том, что вы не указали использовавшиеся вами параметры оптимизации
0
3 / 3 / 1
Регистрация: 04.02.2011
Сообщений: 37
26.12.2012, 08:04  [ТС]
Цитата Сообщение от ForEveR Посмотреть сообщение
crastin,
Простите, что? С определенно быстрее будет, если правильно на нем писать, однако намного менее удобнее.
Согласен. В stl необходимо обращаться ко всяким operator() operator*. Для посимвольной обработки строк это не подходит, а в обработке больших классов может серьезно облегчить жизнь. Просто реакция хабровчан очень странная. В комментариях на хабре написано, что код в первом посте работает быстрее чем на C. Сначала я думал как такое может быть, потом захотелось узнать, правду ли там написали.
Цитата Сообщение от yekka Посмотреть сообщение
crastin, вы в курсе, что то, что вы привели даже не скомпилируется?
не говоря о том, что вы не указали использовавшиеся вами параметры оптимизации
Этот компилируется
1.cpp
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
26
27
28
29
30
31
32
33
34
35
#include "1.h"
#include <stdio.h>
#include <string.h>
 
void f(void) {
  cout << "message" << endl;
} 
 
int hash_c(const char* str) {
  int h = 0;
  const int len = strlen(str);
  for (int i = 0; i < len; ++i)
    h = 31*h + str[i];
  return h;
}
     
int hash_stl(const std::string& str) {
  int h = 0;
  for_each (str.begin(),str.end(), hasher(h));
   return h;
}
 
#define TIMEEXEC 1000*10000
 
void ccout(){
  for (int i = 0; i < TIMEEXEC; i++){
    hash_c("this is spartaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
  }
}
 
void cppout(){
  for (int i = 0; i < TIMEEXEC; i++){
    hash_stl("this is spartaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
  }
}
1.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <algorithm>
using namespace std;
 
struct hasher: public std::unary_function< const char, void > {
  int &res;
  inline hasher(int &inp): res(inp){};
  inline void operator()( const char c ){res = 31*res + c;};
};
 
 
 
void f(void); 
void ccout();
void cppout();
int hash_c(const char* str);
int hash_stl(const std::string& str);
fcgi.cpp
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <pthread.h> 
#include <sys/types.h> 
#include <stdio.h> 
#include "1.h"
#include <sys/time.h>
 
extern "C" {
#include "fcgi_config.h" 
#include "fcgiapp.h" 
}
 
#define THREAD_COUNT 8 
#define SOCKET_PATH "127.0.0.1:9000" 
 
inline long long gettimeus()
{
    struct timeval tv;
 
    gettimeofday( &tv, NULL );
    return (long long) tv.tv_sec * 1000000LL + (long long) tv.tv_usec;
}
 
 
//хранит дескриптор открытого сокета 
 
 
int main(void) 
{ 
  long long tm = -gettimeus();
  ccout();
  tm += gettimeus();
  printf ("time of c %u\n",tm);
  tm = -gettimeus();
  cppout();
  tm += gettimeus();
  printf ("time of cpp %u\n",tm);
 
 
    return 0; 
}
Makefile
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#developer mode
#CPPFLAGS = -ansi -Wall -pedantic -g -pg 
 
#release mode
CFLAGS = -ansi -Wall -pedantic
 
fcgi: fcgi.o 1.o
    $(CC) -pg  -o fcgi fcgi.o 1.o -lstdc++
 
1.o: 1.h 1.cpp
fcgi.o: 1.h fcgi.cpp
 
clean:
    rm 1.cpp~ 1.h.gcg 1.h~ 1.o fcgi.cpp~ fcgi.o 1.h.gch Makefile~ gmon.out
Если заменить параметры CFLAGS и выполнить профилирование. В списке вылезет куча классов типа _gcc_gnu::operator
0
1443 / 1326 / 131
Регистрация: 20.03.2009
Сообщений: 4,689
Записей в блоге: 11
26.12.2012, 08:10
Цитата Сообщение от crastin Посмотреть сообщение
В stl необходимо обращаться ко всяким operator() operator*
как правило, эти операторы inline

На хабре же все написали, что думают про автора.
Дальше предполагалось, что будет так:
C++ (Qt)
1
2
3
4
5
6
void cppout(){
  std::string str = "this is spartaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
  for (int i = 0; i < TIMEEXEC; i++){
    hash_stl(str);
  }
}
А как же флаг оптимизации -O2?
1
3 / 3 / 1
Регистрация: 04.02.2011
Сообщений: 37
26.12.2012, 09:50  [ТС]
Dmitriy_M да так быстрее, почему-то я забыл про аллокации, но хабраюзер написал что вариант C++ работает в 3 раза быстрее. В этом случае вариант на с - 81 мкс, на c++ - 130 мкс.
0
51 / 49 / 7
Регистрация: 31.10.2011
Сообщений: 98
26.12.2012, 10:21
Цитата Сообщение от crastin Посмотреть сообщение
Dmitriy_M да так быстрее, почему-то я забыл про аллокации, но хабраюзер написал что вариант C++ работает в 3 раза быстрее. В этом случае вариант на с - 81 мкс, на c++ - 130 мкс.
Кажется, что разница в микросекунды облдает высокой степенью погрешности. Надо прогонять тест несколько раз, чтобы были секунды (ну и замерять время между начало цикла теста и концом).
В целом, C++ должен быть медленнее, но не критично.
0
1443 / 1326 / 131
Регистрация: 20.03.2009
Сообщений: 4,689
Записей в блоге: 11
26.12.2012, 10:54
Не нравиться мне представленная hash_stl.
Такой код более общий
C++ (Qt)
1
2
3
4
5
6
template<typename Iterator>
int hash_stl(Iterator begin, Iterator end) {
    int h = 0;
    std::for_each ( begin, end, hasher(h));
    return h;
}
Что позволяет писать
C++ (Qt)
1
2
char str[] = "Hello world";
hash_stl(str, str + strlen(str) - 1);
0
3 / 3 / 1
Регистрация: 04.02.2011
Сообщений: 37
26.12.2012, 13:05  [ТС]
Кажется, что разница в микросекунды облдает высокой степенью погрешности. Надо прогонять тест несколько раз, чтобы были секунды (ну и замерять время между начало цикла теста и концом).
Все проверил вариант C++ на 10% быстрее.
0
 Аватар для Kastaneda
5232 / 3206 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
26.12.2012, 18:23
Цитата Сообщение от crastin Посмотреть сообщение
под stl на деле получаются более быстрые приложения
Цитата Сообщение от crastin Посмотреть сообщение
Все проверил вариант C++ на 10% быстрее.
Просто предположение:
g++ активно развиваются (впрочем как и gcc), но С есть С, там сказал "функция", значит это будет функция. А в плюсах больше простора для оптимизации на уровне компилятора. Там ни каких функций (методов) может и не быть, все может быть заинлайнено, а цикл развернут.
Чтоб понять причину, нужно смотреть ассемблерный код. В общем случае С конечно же быстрее.
0
Higher
 Аватар для diagon
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
26.12.2012, 20:46
У вас реализация на си крайне кривая. Вы делаете два прохода по строке, а в плюсовом варианте все делается за один проход.
В среднем, STL немного медленнее специально оптимизированного кода на си, но быстрее обычного кода(вроде того, что выше).
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.12.2012, 20:46
Помогаю со студенческими работами здесь

Linux mint + win 8 + uefi + hibernate - пропал загрузчик linux
Здравствуйте, скажу сразу, линукс установил впервые, поэтому может вопрос будет нубский. На ноуте lenovo b590 - есть предустановленная...

Нужен компилятор под linux mint или linux ubuntu
Нужен компилятор под linux mint или linux ubuntu. Желательно голенький компилятор без редактора, и, было бы классно, без интерфейса (как...

Перенос программы под Linux: номера системных вызовов в DOS и Linux не совпадают
Здравствуйте, уважаемые программисты всея форума! Доброго вам времени суток! =) Есть у меня задание - перенести программу, написанную...

Что лучше для сервера сайта Arch Linux или Linux Debian ?
Подскажите пожайлуста что лучше для сервера сайта Arch Linux или Linux Debian ?

Установка Qt на Linux для кросс-компиляции: Linux 32/64 Windows 32/64
В силу объективных причин пришлось перейти на Linux, но столкнулся с проблемой установки окружения Qt. Нужна установка Qt на Linux Mint для...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru