Здравствуйте, 31415926, Вы писали:
3>Чтобы оценить свои силы, можете попробовать решить за 10 минут следующую задачу.
3>Имеется массив, содержащий тестовые данные, которые используются несколькими потоками для создания тестовой нагрузки сервера. 3>Требуется реализовать lock-free алгоритм, которые позволял бы нескольким потокам выбирать данные из массива. После того, как все данные выбраны, начать с начала (циклический буфер). В остальном данные должны извлекаться без пропусков и повторений. Подчеркиваю, алгоритм должет быть lock-free.
String[] data = ...
AtomicInteger counter = new AtomicInteger();
eaa>Тут вообще всё смешалось в одну кучу... и понятие освоить, и пройти собеседование, и годы опыта, и синьёр
....
Да все правильно Вы пишите (ну — точнее, почти все, но это частности). Я сам не понимаю в чем дело.
Но люди "плавают" в элементарнейших вопросах. Ничего заумного мы не спрашиваем, сигнатуры методов на память называть не требуем,
про экзотические фреймворки не пытаем. Неужели спросить, как устроен HashMap — это наезд? А ведь и это многих ставит в тупик.
Я полагаю, что это, отчасти, "вина" J2EE — люди тратят много сил на изучение фреймворков, а про собственно язык программирования забывают.
Другое возможное объяснение — это проскальзывающее время от времени на российских форумах убеждение, что системный аналитик — это круто, "знание предметной области" — повод для гордости, а остальное, как говорил один мой бывший начальник, "детали реализации". Возможно, что это и так.
Вот только иногда (как в нашем случае) эти "детали" как раз очень важны.
Re[11]: про опыт работы в X с языком(технологией) XX
eaa>String[] data = ... eaa>AtomicInteger counter = new AtomicInteger();
eaa>String item = data[counter.getAndIncrement() % data.length];
eaa>Оформлять в виде полного исходника лень, я ведь всё так не Ява программист и не претендую на вашу вакансию
eaa>И того, наверное, минут 5 вместе с поиском AtomicInteger
Что-ж так тоже можно, но не здорово — рано или поздно значение counter перелезет через Integer.MAX_VALUE и станет отрицательным.
Конечно, это произойдет не скоро, но есть и более корректное решение
Re[6]: про опыт работы в X с языком(технологией) XX
Здравствуйте, 31415926, Вы писали:
3>Но люди "плавают" в элементарнейших вопросах. Ничего заумного мы не спрашиваем, сигнатуры методов на память называть не требуем, 3>про экзотические фреймворки не пытаем. Неужели спросить, как устроен HashMap — это наезд? А ведь и это многих ставит в тупик.
Нет это не наезд, но ведь вопрос в сущности не по яве. Ведь с точки зрения явы это ассоциативный контейнер. И оценки сложности по операциям. И все. Остальное это уже действительно детали реализации и к яве они отношения не имеют. А на подобный вопрос может ответить любой программист (даже тот кто про яву не слышал) но знает структуру данных ХешТаблица.
А поскольку, как все мы знаем, програмист не должен уметь писать сортировку. То можно и на оценки сложности забить. Просто помнить, что HashMap быстрее TreeMap но как то странно упорядочен и в большенстве случаев этого достаточно.
3>Я полагаю, что это, отчасти, "вина" J2EE — люди тратят много сил на изучение фреймворков, а про собственно язык программирования забывают. 3>Другое возможное объяснение — это проскальзывающее время от времени на российских форумах убеждение, что системный аналитик — это круто, "знание предметной области" — повод для гордости, а остальное, как говорил один мой бывший начальник, "детали реализации". Возможно, что это и так.
Почему круто? Всё просто у вас кто получает больше ПМ или Синьйор девелопер? вроде вот и ответ. А главное куда расти то?
3>Вот только иногда (как в нашем случае) эти "детали" как раз очень важны.
Так может тогда не важна Ява, а важно что то другое? может вы не того ищете?
Re[7]: про опыт работы в X с языком(технологией) XX
Здравствуйте, eaa, Вы писали:
eaa>Нет это не наезд, но ведь вопрос в сущности не по яве. Ведь с точки зрения явы это ассоциативный контейнер. И оценки сложности по операциям. И все. Остальное это уже действительно детали реализации и к яве они отношения не имеют. А на подобный вопрос может ответить любой программист (даже тот кто про яву не слышал) но знает структуру данных ХешТаблица.
Вы ошибаетесь, стандартный HashMap в Java устроен не так, как описано в учебниках по теории программирования вообще (во всяком случае, в некоторых).
И при написании высокопроизводительных приложений понимать это очень невредно. Только не надо говорить, что такие приложения следует писать не на Java.
Re[8]: про опыт работы в X с языком(технологией) XX
Здравствуйте, 31415926, Вы писали:
3>Вы ошибаетесь, стандартный HashMap в Java устроен не так, как описано в учебниках по теории программирования вообще (во всяком случае, в некоторых).
Хм, и чем же этот явовский хешмап отличается? Только что просмотрел исходники
Такой же масив списков элементов с одинаковыми хешами. такой же линейный поиск по ним. обычной мод хешфункции по длинне.
Или речь про стратегии расширения? так это действительно мелочи, если мы уж пишем высокопроизводительное приложение на Яве , не будем же мы на это полагаться... уж лучше сразу выделить.
3>И при написании высокопроизводительных приложений понимать это очень невредно. Только не надо говорить, что такие приложения следует писать не на Java.
сам сейчас такое пишу
Re[12]: про опыт работы в X с языком(технологией) XX
Здравствуйте, 31415926, Вы писали: 3>Что-ж так тоже можно, но не здорово — рано или поздно значение counter перелезет через Integer.MAX_VALUE и станет отрицательным. 3>Конечно, это произойдет не скоро, но есть и более корректное решение
Остаток от деления можно заменить на любую другую операцию, учитывающую в том числе знак.\
Я, кстати, сразу подумал о том же решении (с поправкой на то, что я дотнетчик). Хайвмайнд, блин.
Re[3]: про опыт работы в X с языком(технологией) XX
Здравствуйте, stuav, Вы писали:
S>>>Просветите зачем в параметрах вакансий пишут опыт работы с С++ — 3 года, или SQL — 2 года или что нить аналогичное про джаву. IT>>Не понятно зачем вообще какие-то там языки указывать? Можно просто в резюме написать одно слово — программист. S>Да точно, можно просто написать инженерное образование
А ещё лучше — человек.
S>С другой стороны почему не требуют "уверенное владение microsoft word в течение 10 лет" — тожеш вон она программулина какая большая?
Для тех кому это важно требуют ещё как.
S>Тёмный лес однако...
Ничего тёмного. Года опыта позволяют оценить уровень кандидата с приемлемой точностью для того, чтобы решить вызывать ли его на собеседование.
Если нам не помогут, то мы тоже никого не пощадим.
Здравствуйте, stuav, Вы писали:
S>Просветите зачем в параметрах вакансий пишут опыт работы с С++ — 3 года, или SQL — 2 года или что нить аналогичное про джаву.
Ну наверное считается, что если вы проработали на C++ или на Яве N лет, то вы уже набили себе шишки в стандартных местах и знаете, чего можно делать, а чего нет, какие библиотеки использовать, где их брать и т.п.
Что такое абстрактный SQL не очень понятно, они все разные. Но опять же, наверное поработав несколько лет, научаешься в нем ориентироваться.
Но вообще, количество протертых штанов — плохое мерило знаний.
Re[10]: про опыт работы в X с языком(технологией) XX
Здравствуйте, 31415926, Вы писали:
3>Имеется массив, содержащий тестовые данные, которые используются несколькими потоками для создания тестовой нагрузки сервера. 3>Требуется реализовать lock-free алгоритм, которые позволял бы нескольким потокам выбирать данные из массива. После того, как все данные выбраны, начать с начала (циклический буфер). В остальном данные должны извлекаться без пропусков и повторений. Подчеркиваю, алгоритм должет быть lock-free.
А вы ничего не пропустили в описании задачи? Если потоки только выбирают данные из массива, то массив — read only, и никаких локов не требуется.
Re[12]: про опыт работы в X с языком(технологией) XX
Здравствуйте, 31415926, Вы писали: 3>есть и более корректное решение
Кстати, да, если потоков постоянное число, и выбирают они из массива примерно с одной скоростью (либо число элементов массива делится на число потоков) — то проще каждому раздать начальный индекс в массиве и приращение индекса (равное числу потоков) при выборе следующего элемента.
Re[7]: про опыт работы в X с языком(технологией) XX
eaa>А поскольку, как все мы знаем, програмист не должен уметь писать сортировку. То можно и на оценки сложности забить. Просто помнить, что HashMap быстрее TreeMap но как то странно упорядочен и в большенстве случаев этого достаточно.
Достаточно до тех пор пока в этот хеш не попадут неудобные данные, так что знать как устроен и принцип работы все-таки необходимо.
Re[11]: про опыт работы в X с языком(технологией) XX
Здравствуйте, Pzz, Вы писали:
Pzz>Здравствуйте, 31415926, Вы писали:
3>>Имеется массив, содержащий тестовые данные, которые используются несколькими потоками для создания тестовой нагрузки сервера. 3>>Требуется реализовать lock-free алгоритм, которые позволял бы нескольким потокам выбирать данные из массива. После того, как все данные выбраны, начать с начала (циклический буфер). В остальном данные должны извлекаться без пропусков и повторений. Подчеркиваю, алгоритм должет быть lock-free.
Pzz>А вы ничего не пропустили в описании задачи? Если потоки только выбирают данные из массива, то массив — read only, и никаких локов не требуется.
А причем здесь массив?
Публикую возможное решение:
public T next() {
int idx;
do {
idx = pos.incrementAndGet();
if( idx < data.length ) return data[idx];
}
while( !pos.compareAndSet(idx, 0));
return data[0];
}
Использование compareAndSet — стандартная идиома в lock-free алгоритмах.
Re[12]: про опыт работы в X с языком(технологией) XX
Здравствуйте, 31415926, Вы писали:
3>Здравствуйте, Pzz, Вы писали:
Pzz>>Здравствуйте, 31415926, Вы писали:
3>>>Имеется массив, содержащий тестовые данные, которые используются несколькими потоками для создания тестовой нагрузки сервера. 3>>>Требуется реализовать lock-free алгоритм, которые позволял бы нескольким потокам выбирать данные из массива. После того, как все данные выбраны, начать с начала (циклический буфер). В остальном данные должны извлекаться без пропусков и повторений. Подчеркиваю, алгоритм должет быть lock-free.
Виноват — забал добавить обьявление переменных впрочем, они очевидны).
class DataFeeder<T> {
private final T[] data;
private final AtomicInteger pos = new AtomicInteger(-1);
public DataFeeder(T[] data) {
this.data = data;
}
public T next() {
int idx;
do {
idx = pos.incrementAndGet();
if( idx < data.length ) return data[idx];
}
while( pos.compareAndSet(idx, 0));
return data[0];
}
}
Re[8]: про опыт работы в X с языком(технологией) XX
Здравствуйте, 31415926, Вы писали:
3>Извините, но кандитатов у нас и так более, чем достаточно, а Вы, как, я уже сказал, все равно едва-ли подойдете (еще раз извините). 3>Действуйте "в установленном порядке"
Кста, если кандидатов более чем достаточно, то единственное что нужно это облегчить фильтрацию.
Можно часть работы сбросить на кадровое агенство (если, конечно денег начатьству не очень жалко). Конечно кадровое агенство не способно проверить знания, но они отлично делают механическую работу. Например, мы давали агенству такой тестик: исходничек где то на пол страницы, нужно найти и исправить ошибки. И большие поля для коментариев. Давать кандидату на бумаге (что бы без компа правил в агенстве) потом шлют факсом или сканом. По времени не ограничивать, я проверял на сотрудниках — требует 5 мин времени. Значит у кандидатов займёт 10-15 мин. Впринципе, агенство это подтвердило.
В результате:
резултаты теста и собеседования давали очень близкие результаты, проводились разными людьми, конечно, возможно отсейлись хорошие люди, но ведь цель не найти ВСЕХ хороших людей.
проверка теста занимает 2-3 минуты.
агенство было недовольно тем что нужно присудствие человека лично (но всё равно гонят к себе в офис) и тем что нет ответов от теста (ну не верили они что бывают задания без правельных ответов , но кто платит тот и заказывает музыку.
Re[13]: про опыт работы в X с языком(технологией) XX
Здравствуйте, 31415926, Вы писали:
3>Здравствуйте, eaa, Вы писали:
eaa>>Здравствуйте, 31415926, Вы писали:
3>>>
3>>>class DataFeeder<T> {
3>>> private final T[] data;
3>>> private final AtomicInteger pos = new AtomicInteger(-1);
3>>> public DataFeeder(T[] data) {
3>>> this.data = data;
3>>> }
3>>> public T next() {
3>>> int idx;
3>>> do {
3>>> idx = pos.incrementAndGet();
3>>> if( idx < data.length ) return data[idx];
3>>> }
3>>> while( pos.compareAndSet(idx, 0));
3>>> return data[0];
3>>> }
3>>>}
3>>>
eaa>>может: pos.compareAndSet(data.length, 0) ?
3>Это — одно и то же (в этом месте idx == data.length). Кстати — здесь опечатка (в предыдущем посте правильно): 3>
3>while(!pos.compareAndSet(idx, 0))
3>
вы в условиях говорили, про не белокирующий код. А по сути реализовали эту блокировку вручную. Как будет работать этот код если 100 потоков и масив из 3 элементов. А сами операции быстрые?
Re[15]: про опыт работы в X с языком(технологией) XX
Здравствуйте, 31415926, Вы писали:
3>Здравствуйте, eaa, Вы писали:
eaa>>может: pos.compareAndSet(data.length, 0) ?
3>Это — одно и то же (в этом месте idx == data.length).
Виноват — idx не обязательно == data.length. Насколько я понимаю, оба варианта — правильные.
Просто в моем случае идет проверка, что значение pos не поменялось, что, на мой вкус, более "идиоматично".
Re[16]: про опыт работы в X с языком(технологией) XX
Здравствуйте, eaa, Вы писали:
eaa>вы в условиях говорили, про не белокирующий код. А по сути реализовали эту блокировку вручную. Как будет работать этот код если 100 потоков и масив из 3 элементов. А сами операции быстрые?
compareAndSet — быстрая операция (на большинстве процессоров поддерживается аппаратно). Этот алгоритм — не блокирующий, в частности не требует обращения к ядру ОС для диспетчеризации потоков. Подробнее — "Java Concurrency in Practice". Вообще сейчас — это весьма популярный сюжет в CS.