Программистское абстрактное
Aug. 24th, 2012 11:40 amДано:
using std::string;
string dotted_pair1(const string & a, const string & b) {
return a + '.' + b;
}
string dotted_pair2(const string & a, const string & b) {
return (a + '.') += b;
}Как нетрудно видеть умозрительно, да и экспериментально, dotted_pair2 эффективнее - меньше временных объектов создается. В общем случае компилятор не имеет права делать такую оптимизацию автоматически. Как бы ему объяснить, что в этом конкретном случае он его имеет?
Ну и совсем абстрактно: интересно, программисты на ФЯП в принципе задумываются о зависимости эффективности выполняемого кода от идиоматики исходного, или они выше этих глупостей?
no subject
Date: 2012-08-24 06:52 pm (UTC)no subject
Date: 2012-08-24 06:55 pm (UTC)no subject
Date: 2012-08-24 07:03 pm (UTC)(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:no subject
Date: 2012-08-25 05:23 pm (UTC)Вместо:
string dotted_pair1(const string & a, const string & b) {
return a + '.' + b;
}
Вот это:
string dotted_pair1(const string & a, const string & b) {
string s(a);
s.reserve(EXPECTED_LENGTH * 2);
s += ".";
s += b;
return s;
}
Ну и/или вместо возврата строки через return использовать неконстатную передачу объекта возвращаемой строки по ссылке. Но это банальщина...
no subject
Date: 2012-08-28 12:01 pm (UTC)string dotted_pair1(const string & a, const string & b) { string s(a); s.reserve(EXPECTED_LENGTH * 2); s += "."; s += b; return s; }или, иначе говоря,
string dotted_pair1(string a, const string & b) { a.reserve(EXPECTED_LENGTH * 2); a += "."; a += b; return a; }Один из классиков недаром написал статью со спорным названием типа "хочешь скорости - передавай по значению!".
(no subject)
From:no subject
Date: 2012-08-24 07:11 pm (UTC)gcc 4.7.1: апсолютно адинхуй.
Почему второй вариант вообще проходит — на первый взгляд непонятно.
no subject
Date: 2012-08-24 07:17 pm (UTC)Я тоже пробовал с опаской, но видимо, потому что r-values нельзя лишь передавать по неконстантным ссылкам, а применять к ним неконстантные методы - можно.
no subject
Date: 2012-08-24 07:21 pm (UTC)Различия только вот в чём:
В первом случае пускается конструктор на временную строку с аргументом a, к ней цепляется одна точка, и ей же инициируется возврат, к возврату цепляется b. Деструктор на временную строку, выход из функции.
Во втором случае пускается конструктор на временную строку с аргументом a, к ней цепляется одна точка, к ей же цепляется b, ей же инициируется возврат. Деструктор на временную строку, выход из функции.
Возможно, из-за того, что конкатенации (append()) и конструктору приходится работать с разными данными, в профилировании может набежать разница. Но это уже от твоих данных зависит, а не от компилятора.
(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:no subject
Date: 2012-08-24 07:22 pm (UTC)Я проверил VC2010 - практически идентичные варианты. По числу объектов совершенно одинаковые - один временный, где конкатенируются строки. Разница только в том что во втором случае временный объект создается явно внутри функции, а в первом через move внутри второго оператора конкатенации.
no subject
Date: 2012-08-24 07:44 pm (UTC)no subject
Date: 2012-08-24 08:00 pm (UTC)(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:no subject
Date: 2012-08-24 07:46 pm (UTC)no subject
Date: 2012-08-24 08:01 pm (UTC)no subject
Date: 2012-08-24 09:01 pm (UTC)no subject
Date: 2012-08-24 09:04 pm (UTC)no subject
Date: 2012-08-24 09:27 pm (UTC)(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:no subject
Date: 2012-08-25 10:41 am (UTC)no subject
Date: 2012-08-26 04:31 pm (UTC)no subject
Date: 2012-08-25 10:45 am (UTC)no subject
Date: 2012-08-26 04:30 pm (UTC)no subject
Date: 2012-08-25 07:16 pm (UTC)Чуть ли не самый известный пример, когда программисты на FP задумались о производительности. И каким образом она была достигнута.
no subject
Date: 2012-08-26 04:27 pm (UTC)no subject
Date: 2012-08-26 04:33 pm (UTC)При больших объёмах текста в ByteString эта штука начинает фрагментировать кучу. Поэтому и был придуман text.
no subject
Date: 2012-08-25 09:40 pm (UTC)no subject
Date: 2012-08-28 12:04 pm (UTC)и умный компилятор, который сможет использовать этот факт в вычислениях типа