Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Работа Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 2 3 4 5 [6]      все
 Re: Еще раз о тестовых заданиях  [new]
Кот Матроскин
Member

Откуда: Москва
Сообщений: 8106
Eugene Gri

Уважаемый соискатель(такой-то), хочу выразить Вам признательность за Ваше внимание к нашей компании, по результатам последнего тура собескдования, коллегиальное голосование по Вашей кандидатуре не позволяет мне предложить Вам трудоустройство в нашей Компании. Извините нас, за потраченное Ваше время. Желаем Вам всех благ и увпехов.
HR - такая-то

Правда, никакого "коллегиального голосования" не было, т.е. это ровно такое же вранье - но закомплексованному соискателю должно быть приятно, да.
31 янв 18, 18:18    [21155395]     Ответить | Цитировать Сообщить модератору
 Re: Еще раз о тестовых заданиях  [new]
tehKosh
Member

Откуда:
Сообщений: 97
а подойдет ли для этой задачи реализация и использование какого-нибудь варианта lock-free map?
31 янв 18, 20:03    [21155610]     Ответить | Цитировать Сообщить модератору
 Re: Еще раз о тестовых заданиях  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 26891
Eugene Gri
alexeyvg
пропущено...
Они дали множеству людей тестовые задания, а потом выбрали из тех, кто его выполнил.
Т.е. они не выбирали по критерию "выполнивший задание лучше всех".
Это нормально, по другому и не бывает, это же не официальный тендер.

Понять, как они оценили решение, ну и вообще понять, как прошло собеседование, разумеется, полезно. Но тут уж как повезёт, либо скажут, либо не скажут.
Обычно не говорят, что бы оградить себя от негатива (вот и вы повели себя агрессивно, и вообще большинство людей тоже не будут благодарить и улыбаться). Поэтому кандидата, которому отказали, спихивают на младшую ХР, а она пых-пых придумывает причины, что бы побыстрее закончить разговор, и навсегда.

Да, я думаю, что не нормально, потому что некрасиво лгать людям, даже если человек не подошёл по какм-то качествам, нужно как-то объясниться, дать понять в чём ошибка, ведь все мы можем ошибаться.
Ненормально хотеть получить побольше, отдать поменьше, получить себе профит? :-) Что делать, таково большинство, люди не готовы жертвовать собой ради других, таких единицы, смиритесь.

Тем более причину трудно сформулировать, и к тому же большинство (и вы тоже) не готовы не только к самопожертвованию, но и к принятию жертвы.
Т.е., проще говоря, вам пойдут навстречу, а вы человека размажете. И будет он ходить, весь такой опущенный, и думать "ну нафига я полез помогать, надо было сказать что то обтекаемое из стандартных ответов, он мне что, муж/брат?"
31 янв 18, 21:12    [21155727]     Ответить | Цитировать Сообщить модератору
 Re: Еще раз о тестовых заданиях  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 26891
Eugene Gri
Да, конечно.

Уважаемый соискатель(такой-то), хочу выразить Вам признательность за Ваше внимание к нашей компании, по результатам последнего тура собескдования, коллегиальное голосование по Вашей кандидатуре не позволяет мне предложить Вам трудоустройство в нашей Компании. Извините нас, за потраченное Ваше время. Желаем Вам всех благ и увпехов.
HR - такая-то
Ой, так вам не нужно правдивого ответа? Нужно наврать квалифицированно, что бы после отказа вы ушли воодушевлённый, их бы нахваливали и давали их контакты?
Может, это они могут сделать из соображений выгоды, так сказать, ещё и наварить на кандидате, которому отказали, но с морально-этической стороны тут к ним никаких вопросов нет.
31 янв 18, 21:22    [21155744]     Ответить | Цитировать Сообщить модератору
 Re: Еще раз о тестовых заданиях  [new]
ChronSQL
Member

Откуда:
Сообщений: 492
Eugene Gri
Передача и обработка содержимого каждого файла должна идти отдельным потоком. Пути к папкам входными файлами передаются в качестве параметров первого процесса. Канал взаимодействия между процессами может быть любым.
Не использовать сторонние (не MS библиотеки), предпочтительно использовать только WinAPI и STL.
Использовать только базовый С++ (не С++11 и пр.).

То что нельзя использовать C++11 показывает, что автора самого задания надо менять.
Как минимум, надо использовать C++11 - сохранять пары <8-байт,количество> в локальных для каждого потока std::unordered_map (C++11), и периодически делать пакетную синхронизацию - под std::mutex (C++11) через swap() отдавать в дополнительный поток заполненные локальные std::unordered_map и получать пустые, а дополнительный поток уже будет сливать все полученные локальные std::unordered_map в один глобальный, а затем очистит полученные локальные. (А можно эффективнее без std::mutex через atomic-cas менять индекс текущего локального unordered_map на свободный, но это долго объяснять)

tehKosh
а подойдет ли для этой задачи реализация и использование какого-нибудь варианта lock-free map?

Теоретически - можно, а точнее lock-free resizeable unordered map, т.к. его достаточно, он намного быстрее и намного меньше ест памяти, чем lock-free map (ordered). И не любой lock-free map является resizeable. Но если нельзя использовать C++11 и сторонние библиотеки (libcds - StripedMap / FeldmanHashMap или junction::ConcurrentMap_Leapfrog / Grampa), то самому делать lock-free unordered map на WINAPI atomic functions - это полное извращение. Но lock-free применяются, когда важна low-latency, т.е. соседнему потоку зачем-то срочно нужны данные из другого потока. А в данной задаче этого не требуется, здесь необходим high-throughput, а значит намного быстрее будет редкая пакетная синхронизация.
1 фев 18, 00:12    [21156112]     Ответить | Цитировать Сообщить модератору
 Re: Еще раз о тестовых заданиях  [new]
Eugene Gri
Member

Откуда: Москва
Сообщений: 102
tehKosh
а подойдет ли для этой задачи реализация и использование какого-нибудь варианта lock-free map?


Нет! Использование lock-free map - это не по теме данной задачи, извините, но - мимо!
1 фев 18, 00:20    [21156121]     Ответить | Цитировать Сообщить модератору
 Re: Еще раз о тестовых заданиях  [new]
Eugene Gri
Member

Откуда: Москва
Сообщений: 102
alexeyvg
Eugene Gri
пропущено...

Да, я думаю, что не нормально, потому что некрасиво лгать людям, даже если человек не подошёл по какм-то качествам, нужно как-то объясниться, дать понять в чём ошибка, ведь все мы можем ошибаться.
Ненормально хотеть получить побольше, отдать поменьше, получить себе профит? :-) Что делать, таково большинство, люди не готовы жертвовать собой ради других, таких единицы, смиритесь.

Тем более причину трудно сформулировать, и к тому же большинство (и вы тоже) не готовы не только к самопожертвованию, но и к принятию жертвы.
Т.е., проще говоря, вам пойдут навстречу, а вы человека размажете. И будет он ходить, весь такой опущенный, и думать "ну нафига я полез помогать, надо было сказать что то обтекаемое из стандартных ответов, он мне что, муж/брат?"


Нет, Вы - не правы! Возможно Вас окружают только такие люди, меня-же нет, человек, готовый на жертвы никогда не станет переживать о них. Про профит - "дать меньше - получить больше", да - в этом есть ваша правда, я стараюсь дитанцироваться от таких людей, не всегда получается, но это не означает, что я смирюсь.
1 фев 18, 00:27    [21156134]     Ответить | Цитировать Сообщить модератору
 Re: Еще раз о тестовых заданиях  [new]
Eugene Gri
Member

Откуда: Москва
Сообщений: 102
alexeyvg
Eugene Gri
Да, конечно.

Уважаемый соискатель(такой-то), хочу выразить Вам признательность за Ваше внимание к нашей компании, по результатам последнего тура собескдования, коллегиальное голосование по Вашей кандидатуре не позволяет мне предложить Вам трудоустройство в нашей Компании. Извините нас, за потраченное Ваше время. Желаем Вам всех благ и увпехов.
HR - такая-то
Ой, так вам не нужно правдивого ответа? Нужно наврать квалифицированно, что бы после отказа вы ушли воодушевлённый, их бы нахваливали и давали их контакты?
Может, это они могут сделать из соображений выгоды, так сказать, ещё и наварить на кандидате, которому отказали, но с морально-этической стороны тут к ним никаких вопросов нет.


И да и нет, одновременно. Нужно, по-возможности, в переговорах говорить правду, если не получается, то умело сохранить своё лицо, при этом не принизить оппонента, тем более не выглядеть глупо выдав диссонирующую информацию. "Наварить на кандидате" - ну уж это уже изощренный измышлизм, - фантастика :)
1 фев 18, 00:37    [21156153]     Ответить | Цитировать Сообщить модератору
 Re: Еще раз о тестовых заданиях  [new]
Eugene Gri
Member

Откуда: Москва
Сообщений: 102
ChronSQL
Eugene Gri
Передача и обработка содержимого каждого файла должна идти отдельным потоком. Пути к папкам входными файлами передаются в качестве параметров первого процесса. Канал взаимодействия между процессами может быть любым.
Не использовать сторонние (не MS библиотеки), предпочтительно использовать только WinAPI и STL.
Использовать только базовый С++ (не С++11 и пр.).

То что нельзя использовать C++11 показывает, что автора самого задания надо менять.
Как минимум, надо использовать C++11 - сохранять пары <8-байт,количество> в локальных для каждого потока std::unordered_map (C++11), и периодически делать пакетную синхронизацию - под std::mutex (C++11) через swap() отдавать в дополнительный поток заполненные локальные std::unordered_map и получать пустые, а дополнительный поток уже будет сливать все полученные локальные std::unordered_map в один глобальный, а затем очистит полученные локальные. (А можно эффективнее без std::mutex через atomic-cas менять индекс текущего локального unordered_map на свободный, но это долго объяснять)

tehKosh
а подойдет ли для этой задачи реализация и использование какого-нибудь варианта lock-free map?

Теоретически - можно, а точнее lock-free resizeable unordered map, т.к. его достаточно, он намного быстрее и намного меньше ест памяти, чем lock-free map (ordered). И не любой lock-free map является resizeable. Но если нельзя использовать C++11 и сторонние библиотеки (libcds - StripedMap / FeldmanHashMap или junction::ConcurrentMap_Leapfrog / Grampa), то самому делать lock-free unordered map на WINAPI atomic functions - это полное извращение. Но lock-free применяются, когда важна low-latency, т.е. соседнему потоку зачем-то срочно нужны данные из другого потока. А в данной задаче этого не требуется, здесь необходим high-throughput, а значит намного быстрее будет редкая пакетная синхронизация.



Уважаемый, ChronSQL, доброй ночи!

Я рад!, рад увидеть то как Вы продемонстрировали эрудицию в lock-free, hashed-containers, CAS модных библиотек :) Да, Вы сами сказали, что применение данного подхода важно при low-latency требованиях, здесь же такого требования нет. Использование unordered_map даёт хорошую скорость при малом количестве коллизий, то есть в случае когда данных относительно немного, но когда коллизий хэш-функции уже много, то производительность поиска и вставки резко хуже обычного map!! О-ужас!
Хочу Вас отчасти разочаровать, применять или не применять unordered-map это всего лишь незначимая подробность в решении задачи. А Вот собирать локальные (в контексте Thread-a) статистики, а потом сливать их в общую - это дело, хорошее замечание.
1 фев 18, 01:06    [21156183]     Ответить | Цитировать Сообщить модератору
 Re: Еще раз о тестовых заданиях  [new]
ChronSQL
Member

Откуда:
Сообщений: 492
Eugene Gri
ChronSQL
пропущено...

То что нельзя использовать C++11 показывает, что автора самого задания надо менять.
Как минимум, надо использовать C++11 - сохранять пары <8-байт,количество> в локальных для каждого потока std::unordered_map (C++11), и периодически делать пакетную синхронизацию - под std::mutex (C++11) через swap() отдавать в дополнительный поток заполненные локальные std::unordered_map и получать пустые, а дополнительный поток уже будет сливать все полученные локальные std::unordered_map в один глобальный, а затем очистит полученные локальные. (А можно эффективнее без std::mutex через atomic-cas менять индекс текущего локального unordered_map на свободный, но это долго объяснять)

пропущено...

Теоретически - можно, а точнее lock-free resizeable unordered map, т.к. его достаточно, он намного быстрее и намного меньше ест памяти, чем lock-free map (ordered). И не любой lock-free map является resizeable. Но если нельзя использовать C++11 и сторонние библиотеки (libcds - StripedMap / FeldmanHashMap или junction::ConcurrentMap_Leapfrog / Grampa), то самому делать lock-free unordered map на WINAPI atomic functions - это полное извращение. Но lock-free применяются, когда важна low-latency, т.е. соседнему потоку зачем-то срочно нужны данные из другого потока. А в данной задаче этого не требуется, здесь необходим high-throughput, а значит намного быстрее будет редкая пакетная синхронизация.



Уважаемый, ChronSQL, доброй ночи!

Я рад!, рад увидеть то как Вы продемонстрировали эрудицию в lock-free, hashed-containers, CAS модных библиотек :) Да, Вы сами сказали, что применение данного подхода важно при low-latency требованиях, здесь же такого требования нет. Использование unordered_map даёт хорошую скорость при малом количестве коллизий, то есть в случае когда данных относительно немного, но когда коллизий хэш-функции уже много, то производительность поиска и вставки резко хуже обычного map!! О-ужас!
Хочу Вас отчасти разочаровать, применять или не применять unordered-map это всего лишь незначимая подробность в решении задачи. А Вот собирать локальные (в контексте Thread-a) статистики, а потом сливать их в общую - это дело, хорошее замечание.

Это "О-ужас!" и "резко хуже обычного map!!" только у тех, кто совсем не знает об std::unordered_map, где можно заранее устанавливать необходимое большое количество букетов rehash(кол-во букетов). Или устанавливать max_load_factor(элементов в букете) и исходя из load factor резервировать букеты под заданное число элементов reserve(кол-во элементов).
Тут даже хэш-функцию менять не требуется, хотя и это можно.
	std::unordered_map<uint64_t, uint64_t> um(100000000);  // bucket_count = 100 000 000
	std::cout << "About 100 millions items with an incredibly low probability of collisions \n";
1 фев 18, 03:25    [21156247]     Ответить | Цитировать Сообщить модератору
 Re: Еще раз о тестовых заданиях  [new]
Eugene Gri
Member

Откуда: Москва
Сообщений: 102
ChronSQL
Eugene Gri
пропущено...



Уважаемый, ChronSQL, доброй ночи!

Я рад!, рад увидеть то как Вы продемонстрировали эрудицию в lock-free, hashed-containers, CAS модных библиотек :) Да, Вы сами сказали, что применение данного подхода важно при low-latency требованиях, здесь же такого требования нет. Использование unordered_map даёт хорошую скорость при малом количестве коллизий, то есть в случае когда данных относительно немного, но когда коллизий хэш-функции уже много, то производительность поиска и вставки резко хуже обычного map!! О-ужас!
Хочу Вас отчасти разочаровать, применять или не применять unordered-map это всего лишь незначимая подробность в решении задачи. А Вот собирать локальные (в контексте Thread-a) статистики, а потом сливать их в общую - это дело, хорошее замечание.

Это "О-ужас!" и "резко хуже обычного map!!" только у тех, кто совсем не знает об std::unordered_map, где можно заранее устанавливать необходимое большое количество букетов rehash(кол-во букетов). Или устанавливать max_load_factor(элементов в букете) и исходя из load factor резервировать букеты под заданное число элементов reserve(кол-во элементов).
Тут даже хэш-функцию менять не требуется, хотя и это можно.
	std::unordered_map<uint64_t, uint64_t> um(100000000);  // bucket_count = 100 000 000
	std::cout << "About 100 millions items with an incredibly low probability of collisions \n";


Я и не сомневался, что Вы хорошо знаете об устройстве unordered_map, и даже, может лучше многих. Я не буду с Вами спорить но, думаю, что это тема для отдельного обсуждения. Я хочу сказать, что для данной задачи выбор между map и unordered_map не имеет решающего значения.
1 фев 18, 09:22    [21156496]     Ответить | Цитировать Сообщить модератору
 Re: Еще раз о тестовых заданиях  [new]
tehKosh
Member

Откуда:
Сообщений: 97
ChronSQL, спасибо за коммент по lock-free варианту реализации
ChronSQL
Как минимум, надо использовать C++11 - сохранять пары <8-байт,количество> в локальных для каждого потока std::unordered_map (C++11), и периодически делать пакетную синхронизацию - под std::mutex (C++11) через swap() отдавать в дополнительный поток заполненные локальные std::unordered_map и получать пустые, а дополнительный поток уже будет сливать все полученные локальные std::unordered_map в один глобальный, а затем очистит полученные локальные. (А можно эффективнее без std::mutex через atomic-cas менять индекс текущего локального unordered_map на свободный, но это долго объяснять)

а можно сказать, что такая предложенная реализация по сути является вариантом map-reduce pattern?
1 фев 18, 16:20    [21158232]     Ответить | Цитировать Сообщить модератору
 Re: Еще раз о тестовых заданиях  [new]
ChronSQL
Member

Откуда:
Сообщений: 492
tehKosh
ChronSQL, спасибо за коммент по lock-free варианту реализации
ChronSQL
Как минимум, надо использовать C++11 - сохранять пары <8-байт,количество> в локальных для каждого потока std::unordered_map (C++11), и периодически делать пакетную синхронизацию - под std::mutex (C++11) через swap() отдавать в дополнительный поток заполненные локальные std::unordered_map и получать пустые, а дополнительный поток уже будет сливать все полученные локальные std::unordered_map в один глобальный, а затем очистит полученные локальные. (А можно эффективнее без std::mutex через atomic-cas менять индекс текущего локального unordered_map на свободный, но это долго объяснять)

а можно сказать, что такая предложенная реализация по сути является вариантом map-reduce pattern?

Здесь точно есть подход: Batch-processing - передаем элементы пакетами, а не по одному
Но с натяжкой можно сказать, что есть подход: MapReduce - раздаем задачи и собираем предварительные результаты. Т.к. в классическом MapReduce от одного исполнителя передаются сразу все данные и только затем они сливаются с глобальными результатами, а в моем описании выше - от одного исполнителя многократно приходят части результатов.

https://en.wikipedia.org/wiki/MapReduce
It is inspired by the map and reduce functions commonly used in functional programming

https://en.wikipedia.org/wiki/Map_(higher-order_function)
In C++'s Standard Template Library, it is called std::transform

https://en.wikipedia.org/wiki/Fold_(higher-order_function)
C++ std::accumulate(begin, end, initval, func)

Классический MapReduce - это если задачу можно свести к коду std::transform + std::accumulate:

typedef std::unordered_map<uint64_t, uint64_t> map_t;
struct task_t {
  std::string filename;
  std::shared_ptr<map_t> result;
  std::shared_ptr<std::thread> thread;
};
std::vector<task_t> tasks;

// map
std::transform(tasks.begin(), tasks.end(), tasks.begin(), [](task_t t) -> task_t { 
  t.result = std::make_shared<map_t>();
  t.thread = std::make_shared<std::thread>([&](){ process_function(t.filename, t.result); }); 
  return t;
}); 

// reduce
map_t result_merged_map = 
    std::accumulate(tasks.begin(), tasks.end(), map_t(10000000), // 10 M buckets
    [](map_t map, task_t t) { 
    	t.thread->join(); 
    	return merge_maps(map, t.result); // map.merge(*t.result); C++17
    });
1 фев 18, 19:57    [21158835]     Ответить | Цитировать Сообщить модератору
 Re: Еще раз о тестовых заданиях  [new]
ChronSQL
Member

Откуда:
Сообщений: 492
ChronSQL
t.thread = std::make_shared<std::thread>([&](){ process_function(t.filename, t.result); }); 

Тут конечно [=], а не [&].
1 фев 18, 20:17    [21158881]     Ответить | Цитировать Сообщить модератору
 Re: Еще раз о тестовых заданиях  [new]
tehKosh
Member

Откуда:
Сообщений: 97
ChronSQL, спасибо за развернутый ответ.
1 фев 18, 22:56    [21159119]     Ответить | Цитировать Сообщить модератору
 Re: Еще раз о тестовых заданиях  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34216
Eugene Gri
Не использовать сторонние (не MS библиотеки), предпочтительно использовать только WinAPI и STL.
Использовать только базовый С++ (не С++11 и пр.).

!


мнений тут двух быть не может...

Не С++11 ? Давай, до свидания...
6 фев 18, 03:36    [21168770]     Ответить | Цитировать Сообщить модератору
 Re: Еще раз о тестовых заданиях  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34216
Eugene Gri,

ну и тут достаточно заморочно втаптывать это именно в таком виде..
неделю где-то...
я бы послал их в жопу
у тебя дела нет других?
6 фев 18, 03:39    [21168773]     Ответить | Цитировать Сообщить модератору
 Re: Еще раз о тестовых заданиях  [new]
GuidanceMoralic
Member [скрыт] [заблокирован]

Откуда:
Сообщений: 242
ChronSQL
ChronSQL
t.thread = std::make_shared<std::thread>([&](){ process_function(t.filename, t.result); }); 

Тут конечно [=], а не [&].

ChronSQL - клёвый чел, хотел бы с ним оказаться в одной команде)
6 фев 18, 14:09    [21169911]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 2 3 4 5 [6]      все
Все форумы / Работа Ответить