|
|
|
Что быстрее? (битовый вектор либо массив)
|
|||
|---|---|---|---|
|
#18+
что на ваш взгляд будет работать быстрее (получение значения 0 или 1)? 1) реализация в виде битового вектора int vector; извлечение флага №5 будет такая (1 << 5) & vector 2) реализация в виде массива byte[32] vector извлечение флага № 5 будет такая: vector[5] ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.05.2006, 11:00 |
|
||
|
Что быстрее? (битовый вектор либо массив)
|
|||
|---|---|---|---|
|
#18+
А это так критично? Скорее всего второй вариант будет быстрее, т.к. нет дополнительных операций. А битовые массивы - это для оптимизации использования памяти... И неплохо бы прогнать тест для сравнения... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.05.2006, 11:08 |
|
||
|
Что быстрее? (битовый вектор либо массив)
|
|||
|---|---|---|---|
|
#18+
На мой взгляд все будет зависиьт от компилятора ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.05.2006, 11:09 |
|
||
|
Что быстрее? (битовый вектор либо массив)
|
|||
|---|---|---|---|
|
#18+
я пишу на java, но это не столько критично сколько интересно :) у меня возникли несколько предположений, например, если флаги хранить в битовом векторе какого то числа - то число в кеше - собственно операции быстрее, а если флаги хранить в массиве - то выборка из памяти.. (могу ошибаться) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.05.2006, 11:12 |
|
||
|
Что быстрее? (битовый вектор либо массив)
|
|||
|---|---|---|---|
|
#18+
unicornmirageя пишу на java, но это не столько критично сколько интересно :) у меня возникли несколько предположений, например, если флаги хранить в битовом векторе какого то числа - то число в кеше - собственно операции быстрее, а если флаги хранить в массиве - то выборка из памяти.. (могу ошибаться) Даже при 64K кэше данных 32-х-байтный массив может храниться там довольно долго :) Хотя однозначно сказать трудно, вообще вопрос аппаратно-зависимый. А в случае с Java - JVM ещё может вмешаться ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.05.2006, 11:15 |
|
||
|
Что быстрее? (битовый вектор либо массив)
|
|||
|---|---|---|---|
|
#18+
а что, vector&32 - не судьба? IMHO, если алгоритм таков, что стоит задумываться об оптимизации таких вещей, то лучше переписать на ASM под конкретный процессор - точно будет быстрее. Иначе, операция 1<<5 будет незаметна на фоне всего кода. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.05.2006, 11:26 |
|
||
|
Что быстрее? (битовый вектор либо массив)
|
|||
|---|---|---|---|
|
#18+
saintIMHO, если алгоритм таков, что стоит задумываться об оптимизации таких вещей, то лучше переписать на ASM под конкретный процессор - точно будет быстрее. Иначе, операция 1<<5 будет незаметна на фоне всего кода. И я того же IMHO :) Но ведь автор написал, что unicornmirage это не столько критично сколько интересно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.05.2006, 11:29 |
|
||
|
Что быстрее? (битовый вектор либо массив)
|
|||
|---|---|---|---|
|
#18+
saintа что, vector&32 - не судьба? нет, потому что фактически используются все биты числа в качестве хранения флагов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.05.2006, 11:34 |
|
||
|
Что быстрее? (битовый вектор либо массив)
|
|||
|---|---|---|---|
|
#18+
unicornmirage saintа что, vector&32 - не судьба? нет, потому что фактически используются все биты числа в качестве хранения флагов. Дело в том, что vector&32 == (1 << 5) & vector :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.05.2006, 11:38 |
|
||
|
Что быстрее? (битовый вектор либо массив)
|
|||
|---|---|---|---|
|
#18+
>нет, потому что фактически используются все биты числа в качестве хранения флагов и в чем проблема? как по вашему? для (1<<5)&flags другие флаги не мешают, а 32&vector мешают? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.05.2006, 11:41 |
|
||
|
Что быстрее? (битовый вектор либо массив)
|
|||
|---|---|---|---|
|
#18+
Dmitrii K. unicornmirage saintа что, vector&32 - не судьба? нет, потому что фактически используются все биты числа в качестве хранения флагов. Дело в том, что vector&32 == (1 << 5) & vector :) ну я уже понял что 32 - это 100000 :) но ведь задача не ограничена выборкой только лишь флага №5! в качестве хранения флагов используются все 32 бита числа.. и интерес представляет именно что эффективнее с т.зрения производительности - хранить 32 флага в числе либо использовать массив. в яве скорость критична - она чуть медленнее си. я понимаю что оптимизация - враг хорошего и нужно оптимизировать алгоритмы.. у меня алгоритм связан с большими вычислениями больших таблиц содержащих в столбцах - 32 флага а в строках - значения этих флагов. так вот если флаги хранить в битовом векторе - таблицу можно представить в виде массива int[] vectors чтобы извлечь значение флага из таблицы из строки 10 флаг №5 делаю операцию Код: plaintext 1. 2. 3. во втором случае реализация была бы другой Код: plaintext 1. 2. 3. я давно не програмировал на асме и на си - поэтому наверное отвык немного от таких нюансов - уверен они должны существовать. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.05.2006, 11:49 |
|
||
|
Что быстрее? (битовый вектор либо массив)
|
|||
|---|---|---|---|
|
#18+
Неплохо бы для сравнения прогнать пару тестов на больших объёмах данных... Но если это только часть алгоритма, то такая оптимизация может быть и не очень заметной... В целях оптимизации нужно весь алгоритм пересматривать на предмет поиска "узких мест" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.05.2006, 11:56 |
|
||
|
Что быстрее? (битовый вектор либо массив)
|
|||
|---|---|---|---|
|
#18+
Добрый человек. Во-первых JAVA значительно медленней C. Во-вторых, в вашем конкретном случае int flagValue = 1 << flagNumber & (vectors[row]); будет давать в рамках всего процесса значительный прирост производительности даже с учетом битового сдвига. Тк, в случае увеличения объема данных в 32! раза Вы увеличиваете число циклов обращения к основной памяти минимум в 32! а то и больше раз. А теперь сравните частоты своей системной шины и частоту процессора, на которой работает Ваш кеш. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.05.2006, 12:02 |
|
||
|
Что быстрее? (битовый вектор либо массив)
|
|||
|---|---|---|---|
|
#18+
saintДобрый человек. Во-первых JAVA значительно медленней C. Во-вторых, в вашем конкретном случае int flagValue = 1 << flagNumber & (vectors[row]); будет давать в рамках всего процесса значительный прирост производительности даже с учетом битового сдвига. Тк, в случае увеличения объема данных в 32! раза Вы увеличиваете число циклов обращения к основной памяти минимум в 32! а то и больше раз. А теперь сравните частоты своей системной шины и частоту процессора, на которой работает Ваш кеш. здОрово! именно это мне хотелось наверное и услышать.. спасибо. что касается явы - это я переборщил конечно же :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.05.2006, 12:10 |
|
||
|
Что быстрее? (битовый вектор либо массив)
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.05.2006, 12:22 |
|
||
|
Что быстрее? (битовый вектор либо массив)
|
|||
|---|---|---|---|
|
#18+
unicornmirageну я уже понял что 32 - это 100000 :)кто такой программист ? это человек, искренне верящий, что 32 это 100000 ! :) unicornmirageв качестве хранения флагов используются все 32 бита u> числа.. и интерес представляет именно что эффективнее с u> т.зрения производительности - хранить 32 флага в числе u> либо использовать массив.Мое маленькое ИМХО состоит в том, что процессор оперирует байтами, словами, двойными словами ... и ему всяко проще проводить операции именно с ними. К тому же - это сейчас 32 флага - всё просто, а потом будет 33 и что тогда ? Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.05.2006, 18:42 |
|
||
|
Что быстрее? (битовый вектор либо массив)
|
|||
|---|---|---|---|
|
#18+
to Karabas: ГЫ.. а еще он оперирует 32,64,80 битными float, может будем в них флаги хранить? а шо, это удобно, myflag=float_flags ; if(myflag>1) Do(); работать конечно будет медленней и памяти жрать, зато если вдруг все перейдут на аналоговые процессоры, будет проще код портировать. насчет "с байтом проще" вы не правы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.05.2006, 20:10 |
|
||
|
Что быстрее? (битовый вектор либо массив)
|
|||
|---|---|---|---|
|
#18+
Карабас Барабас К тому же - это сейчас 32 флага - всё просто, а потом будет 33 и что тогда ? согласен, я не против универсальности - но она нужнакогда неизвестные граничные условия задачи. если же граничные условия существуют - лучше реализовать задачу именно в рамках их. в моем случае врядли наберется больше чем 16 флагов - и в необозримом будущем может тоже. поэтому посчитал что 32 - вполне подойдет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.05.2006, 21:26 |
|
||
|
Что быстрее? (битовый вектор либо массив)
|
|||
|---|---|---|---|
|
#18+
saintto Karabas: ГЫ.. а еще он оперирует 32,64,80 битными float, может будем в них флаги хранить? а шо, это удобно, myflag=float_flags ; if(myflag>1) Do(); . я может не понял до конца Вашу мысль - но я под "флагом" имел ввиду просто какое то состояние объекта (к примеру в той же Java) а не как флаги процессора. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.05.2006, 21:33 |
|
||
|
Что быстрее? (битовый вектор либо массив)
|
|||
|---|---|---|---|
|
#18+
>я может не понял до конца Вашу мысль - но я под "флагом" имел ввиду просто какое то состояние объекта (к примеру в той же Java) а не как флаги процессора. я имел ввиду то же самое. по теме, ориентируйтесь на мой пост на 12:02. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.05.2006, 00:17 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=33701176&tid=2031386]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
58ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
58ms |
get tp. blocked users: |
1ms |
| others: | 231ms |
| total: | 392ms |

| 0 / 0 |
