Я не очень понимаю людей, которые из списка тестовых заданий рекомендуют выполнять что-то подобное:
Представьте что вам нужно сделать микросервис, который проводит сделки пользователей из трех различных регионов. У каждого пользователя есть некий баланс средств и он не может совершать сделки на отрицательном балансе. Для простоты сделка полностью проводится внутри микросервиса. Каждый пользователь прикреплен к ближайшему к нему датацентру и к одному из датацентров в качестве резервного. Необходимо сделать микросервис прототип, который позволит продолжить торговлю без остановок в случает падения одного из датацентров. Необходимо продумать все стресс сценарии когда могут возникнуть проблемы с расхождениями баланса и придумать пути их решения. Также желательно продумать схему масштабирования на большее число датацентров и возрастающие объемы сделок.
«в ТЗ ведь не прописано, что надо проверять входные данные на корректность...» — не счесть =)
Если я не эксперт в предметной области, то без спецификаций мы ногу сделать хорошие тесты, да и не понятно корректные эти данные или нет. Поэтому получаются ситуации:
когда тестовый набор отличается от реальных данных, пришлось фактически переписать значительный кусок программы
Переписывание с C# на C++ был рабочим проектом. Грустное это дело переписывать что-либо с C#/Java на C++, в основном из-за поиска чем бы заменить ту или иную библиотеку.
Обычно в таких ситуациях берут какой-нибудь SQLite, который можно сделать in-memory и заводят индексы. Такое проходил когда заставили переписывать приложение с C# и его linq на C++. Тут мне взяли и поставили задачку седлать без БД.
Да. В случае не кратного разбиения допустил ошибку округления. Я не делал предположения, а просто взял не нулевое число. Т.к. в Qt Concurrent map использует пул потоков, то можно варьировать гранулярностью задачи и размером пула.
Полуоткрытый интервал. Путь taskSize = 7, тогда получаем [0, 7); [7, 14); [14, 21)… Возможно где-то ошибся на единицу.
Я всегда использую ссылки везде, где это возможно. Невозможно создать не инициализированную ссылку, в отличие от указателя. Проку от resize/assign тут особого нет. Вектор заполняется один раз, при том, что тут создаются и синхронизируются потоки.
По сути было сказано выше про spinlock и NUMA. Атомарная инструкция заставляет обращаться в память, плюс еще блокировка памяти. В общем происходит насилие шины.
Правда без модели памяти из C++11 эта штука не потоко-безопасная. Потоко-безопасная ленивая инициализация в C++
Так сильно не нравится std::call_once?
Если я не эксперт в предметной области, то без спецификаций мы ногу сделать хорошие тесты, да и не понятно корректные эти данные или нет. Поэтому получаются ситуации:
Говоря про RISC нужно уточнять, что имеется в виду: ARM, MIPS, PowerPC, SPARC. А лучше указывать производителя и модель процессора.
4 std::multiset на 10 000 000, плюс std::vector для хранения исходных данных отъели 2.4Gb. CLion отъел 735 Mb.
В условии задачки есть подсказка:
Я не знаю имеет ли задачка практического применения. Тут пишут, что:
Поэтому все будет зависеть от конкретной реализация дерева.
Тогда наверное проще использоваться localtime и работать с tm
На будущее. Можно сделать такую штуку:
т.е. можно сделать по 3 и более условиям.
Конкретно эта задачка, была как тестовое задание. Счел её интересной.
Переписывание с C# на C++ был рабочим проектом. Грустное это дело переписывать что-либо с C#/Java на C++, в основном из-за поиска чем бы заменить ту или иную библиотеку.
Спасибо, не знал про Boost Multi-index. Вот за что люблю хабр, что в комментариях можно узнать что-то новое.
Обычно в таких ситуациях берут какой-нибудь SQLite, который можно сделать in-memory и заводят индексы. Такое проходил когда заставили переписывать приложение с C# и его linq на C++. Тут мне взяли и поставили задачку седлать без БД.
REACT-PHP-CPP
Тут я имел ввиду последующий два цикла. Первый цикл ждет завершение потоков, второй цикл делает свертку.
Проглядел std::accumulate.
По сути было сказано выше про spinlock и NUMA. Атомарная инструкция заставляет обращаться в память, плюс еще блокировка памяти. В общем происходит насилие шины.
А Apache Kafka удовлетворяла этим требованиям? А на выходе у них получилась не система высокого уровня?