powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Опять завалил собеседование
25 сообщений из 55, страница 1 из 3
Опять завалил собеседование
    #38544656
cucaracha2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Специализируюсь на разработке архитектуры, ООП, юзаю Qt.

Когда прихожу на собеседование на вакансию с++, по части ООП не спрашивают кроме того баянистого примера с переменной массива в классе и отсутствием конструктором копирования. На ООП всем насррать.
Спрашивают про оптимизацию при работе с контейнерами STL.
1)Какую книгу прочитать, где достаточно полно описаны аспекты оптимизации при работе с STL?
2)Не люблю возиться с оптимизацией. Может следует отказаться от карьеры разработчика с++?
...
Рейтинг: 0 / 0
Опять завалил собеседование
    #38544684
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cucaracha2014, начни с этого: эффективное использование stl
...
Рейтинг: 0 / 0
Опять завалил собеседование
    #38544718
cucaracha2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
egorych,

спасибо
...
Рейтинг: 0 / 0
Опять завалил собеседование
    #38544933
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1)Какую книгу прочитать, где достаточно полно описаны аспекты оптимизации при работе с STL?

меерс, effective stl

2)Не люблю возиться с оптимизацией. Может следует отказаться от карьеры разработчика

ну, в общем да.
...
Рейтинг: 0 / 0
Опять завалил собеседование
    #38545012
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добавлю, что я ТОЖЕ не люблю возиться с оптимизацией.
И не нужно этим вообще заниматься, нужно сразу пытаться писать код с оглядкой на производительность.
Только это не заключается в подсчёте IF-ов и WHILE-ов, а в знании стоимостей операций.
...
Рейтинг: 0 / 0
Опять завалил собеседование
    #38545018
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychcucaracha2014, начни с этого: эффективное использование stl

Ну, собственно, этим можно и закончить, потому что чтение этой книги вполне достаточно для того, чтобы вправить мозги по этой теме раз и навсегда.
...
Рейтинг: 0 / 0
Опять завалил собеседование
    #38545472
cucaracha2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZiv,

благодарю
...
Рейтинг: 0 / 0
Опять завалил собеседование
    #38545474
cucaracha2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZivДобавлю, что я ТОЖЕ не люблю возиться с оптимизацией.
нужно сразу пытаться писать код с оглядкой на производительность.

а это не одно и то же?
...
Рейтинг: 0 / 0
Опять завалил собеседование
    #38545655
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cucaracha2014MasterZivДобавлю, что я ТОЖЕ не люблю возиться с оптимизацией.
нужно сразу пытаться писать код с оглядкой на производительность.

а это не одно и то же?
Нет. Одно дело синтетические тесты во время разработки, другое - тормоза у юзера в реале из-за непредвиденных объемов данных или непредвиденного способа использования ПО. Сразу все предвидеть невозможно.
...
Рейтинг: 0 / 0
Опять завалил собеседование
    #38545702
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

Сразу всё можно предвидеть на 80%, а это уже неплохо.
...
Рейтинг: 0 / 0
Опять завалил собеседование
    #38545709
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivDima T,

Сразу всё можно предвидеть на 80%, а это уже неплохо.
Верно, я про оставшиеся 20%, их приходится переписывать. Хотя чем больше предвидишь, тем меньше потом переписывать.
...
Рейтинг: 0 / 0
Опять завалил собеседование
    #38545732
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А еще бывает что для оптимизации ты специально везде писал
Код: plaintext
1.
void fun(const std::string& arg);


а потом в 2011 году оказалось что
Код: plaintext
1.
void fun(std::string arg) 

все равно быстрее.
...
Рейтинг: 0 / 0
Опять завалил собеседование
    #38545845
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky,

да ладно, это мелочи...
однако ты бы поделился опытом, в отдельном топике...
...
Рейтинг: 0 / 0
Опять завалил собеседование
    #38546241
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyА еще бывает что для оптимизации ты специально везде писал
Код: plaintext
1.
void fun(const std::string& arg);


а потом в 2011 году оказалось что
Код: plaintext
1.
void fun(std::string arg) 

все равно быстрее.
почему?
...
Рейтинг: 0 / 0
Опять завалил собеседование
    #38546269
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivв отдельном топике.
лень :)

alex_kпочему?
Потому что, если нам надо сохранить строку, то имея const std::string& мы ее можем только скопировать, а имея std::string мы можем перенести ее содержимое без копирования.
Для строк это не сильно заметно, т.к. многие реализации строк имеют copy-on-write(COW).
А например с объектами, где нет COW, ускорение при отказе от конст. ссылок может быть в разы.
Но естественно, будет ли ускорение зависит от алгоритма. Во многих случаях конст. ссылки быстрее.
Но суть в том что эта зависимость неочевидна, т.к. опирается на многие факторы, такие как инлайн-функции, выведение типов, RVO, rvalue-ссылки, std::move.
Поэтому программист заменяя значения ссылками фактически гадает, а не оптимизирует. Хотя конечно в большинстве случаев угадывает :)

В качестве бонуса привожу код, в котором при замене типа аргумента с конст. ссылки на значение (в остальном код одинаковый), происходит ускорение с 3.6 сек до 2.18 сек, т.е. в 1.65 раз. (Linux x64, G++ 4.8.2, -O2)
(Расход памяти 1ГБ)

Код: plaintext
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.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
#include <iostream>
#include <vector>
#include <map>
#include <boost/date_time.hpp>

using namespace std;

typedef std::map<int, int> value_t;
std::vector<value_t> v;

void add1(const value_t& s)
{
    v.emplace_back(std::move(s));
}

void add2(value_t s)
{
    v.emplace_back(std::move(s));
}

value_t gen_value()
{
    value_t res;
    for(size_t i = 0; i < 200; ++i)
       res[i] = i;
    return res;
}


template <typename AddFn> void test(AddFn fn)
{
    const size_t N = 100000;
    v.clear();
    v.reserve(N);
    boost::posix_time::ptime t1 = boost::posix_time::microsec_clock::universal_time();
    for(size_t i = 0; i < N; ++i) {
        fn(gen_value());
    }
    boost::posix_time::ptime t2 = boost::posix_time::microsec_clock::universal_time();
    cout << (t2-t1) << endl;

}

int main()
{
    // warm up
    test(add1); 
    test(add2);
    // test
    test(add1);
    test(add2);
    return 0;
}
...
Рейтинг: 0 / 0
Опять завалил собеседование
    #38546406
Фотография OoCc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky,

Это камень в огород C++. Еще одна причина почему C++ неможет быть системным языком.
...
Рейтинг: 0 / 0
Опять завалил собеседование
    #38546435
chabapok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
c++ конечно сакс и маздай, но ничего лучше долгое время не было.

и все же:

авторПотому что, если нам надо сохранить строку, то имея const std::string& мы ее можем только скопировать, а имея std::string мы можем перенести ее содержимое без копирования.

Что значит "перенести(1) ее содержимое без копирования(2)" ведь (1) взаимоисключает 2.
Не пойму.
...
Рейтинг: 0 / 0
Опять завалил собеседование
    #38546450
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chabapok,

теперь есть move constructor, и xvalue
и stl контейнеры, видать, все это хорошо кушают :)

но это частный случай, который не говорит против передачи параметров по ссылкам, а говорит в пользу более тщательного изучения нового стандарта :)
...
Рейтинг: 0 / 0
Опять завалил собеседование
    #38546454
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OoCcЭто камень в огород C++. Еще одна причина почему C++ неможет быть системным языком
Это не является причиной почему C++ не может быть системным языком.
И С++ может быть системным языком. :)

chabapokЧто значит "перенести(1) ее содержимое без копирования(2)" ведь (1) взаимоисключает 2.
Не пойму.
Большинство реализаций больших объектов держат данные в куче, а в самом объекте хранят только указатель на данные.
Копирование - это создание второго экземпляра данных в куче с копированием всех данных.
Перемещение- это копирование только указателя, а в исходном объекте указатель очищается, так что только новый объект указывает на эти данные. Это операция намного быстрее чем копирование.
Так как перемещение меняет исходный объект, то оно не может быть применено к константным объектам или ссылкам на них.
...
Рейтинг: 0 / 0
Опять завалил собеседование
    #38546467
chabapok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Но ведь и до этих ваших std::move можно было просто скопировать указатель, без копирования кучи. Тот же std::string это делал совершенно спокойно.
...
Рейтинг: 0 / 0
Опять завалил собеседование
    #38546472
chabapok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И вообще у вас тест некорректен, т.к. непонятно что с чем вы сравниваете - у вас в первом и втором вариантах на выходе, если я правильно понял, получаются разные данные. Там где move данных - у вас исходный обьект разрушается, а во втором случае нет.

То есть вы сравниваете функционально разные процедуры. (если я правильно понял как оно работает)
...
Рейтинг: 0 / 0
Опять завалил собеседование
    #38546487
Вася Уткин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В идеале бы universal reference: template<typename T> void add1(T&& s);

Если уж C++11 (std::move, emplace_back(), ...), то и rvalue reference:
авторtime = 3.1 sec
time = 2.2 sec
time = 2.2 sec
time = 2.1 sec

Anatoly Moskovsky
Код: plaintext
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.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
#include <iostream>
#include <vector>
#include <map>
#include <boost/date_time.hpp>

using namespace std;

typedef std::map<int, int> value_t;
std::vector<value_t> v;

void add1(value_t&& s)
{
    v.emplace_back(std::move(s));
}

void add2(value_t s)
{
    v.emplace_back(std::move(s));
}

value_t gen_value()
{
    value_t res;
    for(size_t i = 0; i < 200; ++i)
       res[i] = i;
    return res;
}


template <typename AddFn> void test(AddFn fn)
{
    const size_t N = 100000;
    v.clear();
    v.reserve(N);
    boost::posix_time::ptime t1 = boost::posix_time::microsec_clock::universal_time();
    for(size_t i = 0; i < N; ++i) {
        fn(gen_value());
    }
    boost::posix_time::ptime t2 = boost::posix_time::microsec_clock::universal_time();
    cout << (t2-t1) << endl;

}

int main()
{
    // warm up
    test(add1); 
    test(add2);
    // test
    test(add1);
    test(add2);
    return 0;
}
...
Рейтинг: 0 / 0
Опять завалил собеседование
    #38546500
Вася Уткин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А если уж C++03, то для производительности по другому делается.
Через ссылку и своп - 240мс
Через ссылку и копирование - 450мс
Через передачу по значению с двойным копированием объекта - 640мс
Получается в любом случае через ссылку больше возможностей к оптимизации :)

авторtime = 0.35 sec
time = 0.43 sec
time = 0.64 sec

time = 0.24 sec
time = 0.45 sec
time = 0.63 sec

Код: plaintext
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.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
#include <iostream>
#include <vector>
#include <map>
#include <ctime>       // clock_t, clock, CLOCKS_PER_SEC


using namespace std;

typedef std::map<int, int> value_t;
std::vector<value_t> v;



void add1(value_t& s)
{
    v.push_back(value_t());
    v.rbegin()->swap(s);
}

void add2(value_t& s)
{
    v.push_back(s);
}

void add3(value_t s)
{
    v.push_back(s);
}

void gen_value(value_t &res)
{
//	res.clear();
    for(size_t i = 0; i < 200; ++i)
       res[i] = i;
}


template <typename AddFn> void test(AddFn fn)
{
    const size_t N = 10000;
    v.clear();
    v.reserve(N);
    clock_t start = clock();
    for(size_t i = 0; i < N; ++i) {
    	value_t res;
    	gen_value(res);
        fn(res);
    }
    clock_t end = clock();
	float time = (float)(end - start)/CLOCKS_PER_SEC;
	std::cout << "time = " << time << " sec" << std::endl;

}

int main()
{
    // warm up
    test(add1); 
    test(add2);
    test(add3);
    std::cout << std::endl;
    // test
    test(add1);
    test(add2);
    test(add3);
    return 0;
}
...
Рейтинг: 0 / 0
Опять завалил собеседование
    #38546511
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вася Уткин,

Я привел пример для const& - стандартной идиоме для передачи объектов в функции.
Просто & не годится для временных объектов.

chabapokИ вообще у вас тест некорректен, т.к. непонятно что с чем вы сравниваете - у вас в первом и втором вариантах на выходе, если я правильно понял, получаются разные данные. Там где move данных - у вас исходный обьект разрушается, а во втором случае нет
В моем тесте исходный объект (gen_value()) разрушается в обоих случаях. Но со ссылкой это происходит медленнее.
...
Рейтинг: 0 / 0
Опять завалил собеседование
    #38546512
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyПросто & не годится для временных объектов.
А && не годится для невременных.
...
Рейтинг: 0 / 0
25 сообщений из 55, страница 1 из 3
Форумы / C++ [игнор отключен] [закрыт для гостей] / Опять завалил собеседование
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]