|
Как оптимизировать?
|
|||
---|---|---|---|
#18+
Можно ли как-то сделать, чтобы работало быстрее? Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
Интересно, что когда я попробовал отказаться от getter-ов, то стало работать медленнее. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2020, 14:45 |
|
Как оптимизировать?
|
|||
---|---|---|---|
#18+
Скорее всего - никак, без понимания внутренней структуры CompactHash. Если внутри - биткарта - то возможно сложением по модулю 2 (XOR) двух хешей и подсчетом битов в результате мы получим то что ты хотел. Но это нарушает инкапсуляцию. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2020, 14:52 |
|
Как оптимизировать?
|
|||
---|---|---|---|
#18+
С учетом 16 значений - как-то хочется MMX, но тогда JNI Вроде, в И-нете предлагают заменять abs на подсчет двух вариантов + OR. Насколько это работает и математически правильно - не знаю http://www.asmcommunity.net/forums/topic/?id=18590 ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2020, 15:03 |
|
Как оптимизировать?
|
|||
---|---|---|---|
#18+
mayton Скорее всего - никак, без понимания внутренней структуры CompactHash. Если внутри - биткарта - то возможно сложением по модулю 2 (XOR) двух хешей и подсчетом битов в результате мы получим то что ты хотел. Но это нарушает инкапсуляцию. Там просто 16 int полей. Собственно вот в первом посте они все и есть. Поля хранят информацию о цветовой гамме видео файла, нужно понять на сколько один файл по этой гамме близок к другому. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2020, 15:14 |
|
Как оптимизировать?
|
|||
---|---|---|---|
#18+
Сразу скажу что java не сильна в таких операциях. Тут как раз был-бы нужен JNI+C и какая-то библиотека на подобие OpenCV. А задача твоя может звучит как (примерно) Расстояние Манхеттена на целочисленных векторах. Формула - глупая. (среднее квадратическое было-бы лучше) тк. на ней слабые компоненты вектора будут полностью подавлены соседями которые по модулю будут более численно велики. По смыслу это так как будто слабый синий цвет в численном превосходстве подавляет зеленый хотя субъективно все наоборот. Да и вообще подобные метрики считают в double а не в int. Там есть хотя-бы какая-то толерантность к малым величинам. Ябы переписал на JNI/С++ Код: plaintext 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2020, 15:28 |
|
Как оптимизировать?
|
|||
---|---|---|---|
#18+
mayton А задача твоя может звучит как (примерно) Расстояние Манхеттена на целочисленных векторах. Формула - глупая. (среднее квадратическое было-бы лучше) тк. на ней слабые компоненты вектора будут полностью подавлены соседями которые по модулю будут более численно велики. По смыслу это так как будто слабый синий цвет в численном превосходстве подавляет зеленый хотя субъективно все наоборот. Что-то я не догнал, если честно, можно пример? mayton Да и вообще подобные метрики считают в double а не в int. Там есть хотя-бы какая-то толерантность к малым величинам. Есть ли смысл, если данные изначально байтовых массивах и нужно посчитать колличество тех или иных значений? mayton Ябы переписал на JNI/С++ Код: plaintext 1.
Это да, но хотелось бы оставить на последок, я думал может можно как-то математически обыграть. Вот выше Leonid Kudryavtsev написал, например, нужно будет попробовать понять, но уже не сегодня. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2020, 16:59 |
|
Как оптимизировать?
|
|||
---|---|---|---|
#18+
Hett Это да, но хотелось бы оставить на последок, я думал может можно как-то математически обыграть. Вот выше Leonid Kudryavtsev написал, например, нужно будет попробовать понять, но уже не сегодня. Математически эта формула уже несократима. Но можно сыграть на командах MMX/SSE/AVX (по первому - Леонид писал). Но Java это не умеет напрямую делать. Поэтому - JNI. Либо запускать вычисления в много потоков но в данном конкретном случае (оба вектора очень маленькие) и шаблоны map/reduce здесь не будут иметь практической пользы. Потоки просто не успеют разогнаться и сделать join как расчет уже закончен. Тоесть это все равно что ты решил мешок картошки подвезти на 20 см на тяжелом траке. Вот если-бы массивы были хотя-б по мильену... ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2020, 18:05 |
|
Как оптимизировать?
|
|||
---|---|---|---|
#18+
Zzz79 Интересно что ты пишешь ,если у тебя такие проблемы)) По опыту не факт что проблема есть, иногда на энтерпрайзе люди просто придумывают себе задачу ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2020, 20:00 |
|
Как оптимизировать?
|
|||
---|---|---|---|
#18+
Пусть перевернет поля на 90 градусов. Вот так. Код: java 1. 2. 3. 4.
Опять-же это формулу не меняет но позволяет хотя-бы подойти к векторизации. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2020, 20:06 |
|
Как оптимизировать?
|
|||
---|---|---|---|
#18+
1) Смотрю на http://developer.classpath.org/doc/java/lang/Math-source.html Если это правда, то вполне возможно, что возведение в квадрат (как советовал mayton) будет быстрее, чем условные переходы. 2.1) На C еще предлагают реализовывать abs(x) = (x XOR y) - y where y = x >>> 31 (assuming 32-bit input), and >>> is arithmetic right shift operator. gcc 4.6.3 generated assembly snippet (AT&T syntax) movl -8(%rbp), %eax # -8(%rbp) is memory for x on stack sarl $31, %eax # shift arithmetic right: x >>> 31, eax now represents y movl %eax, %edx # xorl -8(%rbp), %edx # %edx = x XOR y movl %edx, -4(%rbp) # -4(%rbp) is memory for output on stack subl %eax, -4(%rbp) # (x XOR y) - y 2.2) If you have a fast multiply by +1 and -1, the following will give you abs(x): ((x >>> 30) | 1) * x и много других способов https://stackoverflow.com/questions/2639173/x86-assembly-abs-implementation Но как изобразить на Java где unsigned арифметика через ж... - х.з. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2020, 20:13 |
|
Как оптимизировать?
|
|||
---|---|---|---|
#18+
Вполне возможно, что уход с int на float так же может быть оправдан. Т.к. будет аппаратная реализация данной инструкции "In general, computing the absolute-value of a floating-point quantity is an extremely cheap and fast operation." ( C ) интернет " it, most implementations follow the IEEE-754 standard. In that standard, each floating-point value's representation contains a bit known as the sign bit, and this marks whether the value is positive or negative....Therefore, taking the absolute value basically just amounts to flipping a byte in the value's representation in memory. In particular, you just need to mask off the sign bit (bitwise-AND), forcing it to 0—thus, unsigned." Скорость не замерял. Нужно не мне. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2020, 20:22 |
|
Как оптимизировать?
|
|||
---|---|---|---|
#18+
Да нет же. Не в том суть. Не быстрее. Точнее. По сути мы считаем гипотенузу в 15 мерном пространстве между двумя точками-хешами. Это более правильная метрика чем Манхеттен. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2020, 20:24 |
|
Как оптимизировать?
|
|||
---|---|---|---|
#18+
Если abs сделано через условные переходы..... то 16 переходов, 8 промахов предсказателя переходов... тут хоть возведение в квадрат, хоть квадратный корень, хоть тригонометрические ф-ции - будет совершенно пофиг Но это нужно иметь доступ к актуальным исходникам + быть уверенным, что ф-ции приведенные в исходниках ровно те же, которые реально используются JVM. Последнее предложение поясняю: ряд ф-ций хоть и имеют исходники на Java, на самом деле заменяются C-инлайнами реализованными в ядре/JIT. Я бы подумал, что базовые арифметические функции, по хорошему, авторы Java должны были бы на C в JIT перетащить. Относится ли к этим ф-циям Math.abs - х.з. Смотреть код Open JDK или замерять время, лично мне влом. Персонально я, взял бы в руки C с inline ассемблером и переписал на MMX. две пары по 3 инструкции (в первых Pentium было два исполняемых блока, т.ч. фактически 3 последовательные инструкции, т.к. две пары будет выполняться на разных процессорных блоках). Все остальное - от лукавого. IMHO & AFAIK На невозможность выполнения на 386, 486 процессорах - думаю в наше время можно забить. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2020, 20:38 |
|
Как оптимизировать?
|
|||
---|---|---|---|
#18+
Мне кажется что в формуле Хетта слишком много ненужного полиморфизма. Он не дает оптимизатору видеть что собственно мы работаем с двумя векторами. Эти getters... чорт бы их побрал. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2020, 20:41 |
|
Как оптимизировать?
|
|||
---|---|---|---|
#18+
mayton Мне кажется Вы излишне оптимистично относитесь к JIT Его тоже разрабатывали наши коллеги-программисты. Коллегам нужно доверять. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2020, 20:47 |
|
Как оптимизировать?
|
|||
---|---|---|---|
#18+
В плане correctness, я доверяю им на 100% А вот в части simd или векторизации... Тут даже не вопрос доверия. А скорее - понимания предназначения. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2020, 21:12 |
|
Как оптимизировать?
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev Но как изобразить на Java где unsigned арифметика через ж... - х.з. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2020, 04:57 |
|
|
start [/forum/topic.php?fid=59&msg=39950028&tid=2120827]: |
0ms |
get settings: |
4ms |
get forum list: |
6ms |
check forum access: |
1ms |
check topic access: |
1ms |
track hit: |
50ms |
get topic data: |
3ms |
get forum data: |
1ms |
get page messages: |
272ms |
get tp. blocked users: |
0ms |
others: | 298ms |
total: | 636ms |
0 / 0 |