Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Visual C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.06.2017, 00:05   #1
Dmitry_B
Пользователь
 
Регистрация: 29.03.2009
Сообщений: 83
По умолчанию Эффективность valarray

Поделитесь пожалуйста впечатлениями от использования класса valarray:
у меня сложилось впечатление, что он проигрывает в скорости вычислений использованию обычных массивов.
Dmitry_B вне форума Ответить с цитированием
Старый 11.06.2017, 05:14   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Не используйте старые компиляторы майкрософта. Выделяйте память под результат сразу.
p51x вне форума Ответить с цитированием
Старый 11.06.2017, 08:40   #3
Dmitry_B
Пользователь
 
Регистрация: 29.03.2009
Сообщений: 83
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Не используйте старые компиляторы майкрософта. Выделяйте память под результат сразу.
Вот мой тест:
Код:
#define N_array 47440000

void CMainFrame::OnTestValArray() 
{
	// TODO: Add your command handler code here

	CTime TheTime;
	CString OutTime;
	valarray<double> A(N_array);
	valarray<double> B(N_array);
	clock_t start, finish;
	double ValTime, NormTime;

	int i;
	for(i=0; i<N_array; i++) A[i] = i;

	start = clock();
	B=sin(A);
	finish = clock();

	ValTime = (double)(finish - start)/CLOCKS_PER_SEC;

	start = clock();
	for(i=0; i<N_array; i++) B[i] = sin(A[i]);
	finish = clock();

	NormTime = (double)(finish - start)/CLOCKS_PER_SEC;

	OutTime.Format("Time valarray %f ñ\r\nTime array %f c\r\nRelation %f", ValTime, NormTime, ValTime/NormTime);
	MessageBox(OutTime,"Test results",MB_OK);

}
Если кто не пожалеет времени, попробуйте его у себя.
У меня valarray на 30% медленнее вычислений над массивами.
При компиляции выяснилось, что члены класса valarray max() и min() конфликтуют с одноименными макроопределениями, так что пришлось в заголовочном файле valarray их закомментировать.
Dmitry_B вне форума Ответить с цитированием
Старый 11.06.2017, 09:02   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Цитата:
При компиляции выяснилось, что члены класса valarray max() и min() конфликтуют с одноименными макроопределениями, так что пришлось в заголовочном файле valarray их закомментировать.
Самый тупой шаг. Правильно: перед включением заголовка виндовс задефайнить NOMINMAX

Так какой у вас компилятор? Какой результат? Тем более, что вы неполный код дали.
p51x вне форума Ответить с цитированием
Старый 11.06.2017, 09:09   #5
Dmitry_B
Пользователь
 
Регистрация: 29.03.2009
Сообщений: 83
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Самый тупой шаг. Правильно: перед включением заголовка виндовс задефайнить NOMINMAX

Так какой у вас компилятор? Какой результат? Тем более, что вы неполный код дали.
Чего не хватает в коде?
Dmitry_B вне форума Ответить с цитированием
Старый 11.06.2017, 09:41   #6
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Цитата:
Сообщение от Dmitry_B Посмотреть сообщение
У меня valarray на 30% медленнее вычислений над массивами
Тестируйте Release сборку.
waleri вне форума Ответить с цитированием
Старый 11.06.2017, 09:49   #7
Dmitry_B
Пользователь
 
Регистрация: 29.03.2009
Сообщений: 83
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Тестируйте Release сборку.
Это и была Release.
Впрочем, Debug или Release - дела не меняет, отношение времен вычислений примерно то же: valarray медленнее процентов на 30.
Dmitry_B вне форума Ответить с цитированием
Старый 11.06.2017, 10:46   #8
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Цитата:
Сообщение от Dmitry_B Посмотреть сообщение
Чего не хватает в коде?
Цитата:
prog.cpp:3:6: error: ‘CMainFrame’ has not been declared
void CMainFrame::OnTestValArray()
^~~~~~~~~~
prog.cpp: In function ‘void OnTestValArray()’:
prog.cpp:7:2: error: ‘CTime’ was not declared in this scope
CTime TheTime;
^~~~~
prog.cpp:8:2: error: ‘CString’ was not declared in this scope
CString OutTime;
^~~~~~~
prog.cpp:9:2: error: ‘valarray’ was not declared in this scope
valarray<double> A(N_array);
^~~~~~~~
prog.cpp:9:11: error: expected primary-expression before ‘double’
valarray<double> A(N_array);
^~~~~~
prog.cpp:10:11: error: expected primary-expression before ‘double’
valarray<double> B(N_array);
^~~~~~
prog.cpp:11:2: error: ‘clock_t’ was not declared in this scope
clock_t start, finish;
^~~~~~~
prog.cpp:15:27: error: ‘A’ was not declared in this scope
for(i=0; i<N_array; i++) A[i] = i;
^
prog.cpp:17:2: error: ‘start’ was not declared in this scope
start = clock();
^~~~~
prog.cpp:17:16: error: ‘clock’ was not declared in this scope
start = clock();
^
prog.cpp:18:2: error: ‘B’ was not declared in this scope
B=sin(A);
^
prog.cpp:18:8: error: ‘A’ was not declared in this scope
B=sin(A);
^
prog.cpp:18:9: error: ‘sin’ was not declared in this scope
B=sin(A);
^
prog.cpp:19:2: error: ‘finish’ was not declared in this scope
finish = clock();
^~~~~~
prog.cpp:21:37: error: ‘CLOCKS_PER_SEC’ was not declared in this scope
ValTime = (double)(finish - start)/CLOCKS_PER_SEC;
^~~~~~~~~~~~~~
prog.cpp:29:2: error: ‘OutTime’ was not declared in this scope
OutTime.Format("Time valarray %f ñ\r\nTime array %f c\r\nRelation %f", ValTime, NormTime, ValTime/NormTime);
^~~~~~~
prog.cpp:30:36: error: ‘MB_OK’ was not declared in this scope
MessageBox(OutTime,"Test results",MB_OK);
^~~~~
prog.cpp:30:41: error: ‘MessageBox’ was not declared in this scope
MessageBox(OutTime,"Test results",MB_OK);
^
10 ideone

P.S. И как я уже говорил, возьми майкрософтский компиль поновее.

Последний раз редактировалось p51x; 11.06.2017 в 10:49.
p51x вне форума Ответить с цитированием
Старый 11.06.2017, 10:54   #9
Dmitry_B
Пользователь
 
Регистрация: 29.03.2009
Сообщений: 83
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
10 ideone
Проект создан с использованием MFC.
Dmitry_B вне форума Ответить с цитированием
Старый 11.06.2017, 11:02   #10
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Да мне, как и всем здесь, плевать на чем он создан. ВЫ попросили протестить код, ВЫ выложили код теста... и с чего это должна быть наша проблема его доводить до ума?

По сколько вы на прямые вопросы в очередной раз не отвечаете, делаю вывод, что вам только пофлудить, похайпить и похейтить. За сим удаляюсь.
p51x вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Эффективность и сложность исследуемого алгоритма NastyaShuvalova C# (си шарп) 0 12.04.2014 12:11
Вычислить эффективность алгоритма быстрой сортировки. Proskurina Паскаль, Turbo Pascal, PascalABC.NET 0 15.11.2012 19:37
Эффективность или переносимость kineziz Общие вопросы C/C++ 16 12.09.2012 22:03
Эффективность C++ и Delphi Hottabych C++ Builder 8 05.01.2011 15:53