Скорость: четыре целых числа или одно целое число со многими операциями

#java #performance #variables #int #bit-manipulation

#java #Производительность #переменные #int #манипулирование битами

Вопрос:

У меня есть вопрос о скорости для Java. Я создаю шахматную программу и хочу проверить, стоит ли использовать int ее в качестве переменной для хранения четырех int переменных, значения которых варьируются от 1 до 4 бит.

Проблема в том, что мне часто приходится извлекать и вставлять новые части переменной, так что это будет стоить довольно много побитовых операций.

Код:

 int fromX = 4, fromY = 5, toX = 6, toY = 7;
int move = 0
move |= toY;
move = move << 4;
move |= toX;
move = move << 4;
move |= fromY;
move = move << 4;
move |= fromX;

doWork(move);
  

или

 int fromX = 4, fromY = 5, toX = 6, toY = 7;
doWork(fromX, fromY, toX, toY);
  

doWork() будет делать много разных вещей с координатами, в основном извлекать их из ‘int’ или просто использовать переменные.

Что я должен использовать?

Комментарии:

1. В Java нет «неподписанного».

2. Я полагаю, он имеет в виду «целое число, в котором я игнорирую знаковый бит».

3. Вы правы, я просто имею в виду «int»…

4. Я думаю, вопрос в том, влечет ли передача 4 аргументов штраф за скорость при передаче 1 аргумента. Я склонен думать, что стоимость упаковки ваших 4 переменных в одну, а затем распаковки на другой стороне будет менее эффективной, чем все, что делает Java с 4 аргументами.

Ответ №1:

Я хочу проверить, стоит ли использовать одно ‘unsigned int’ в качестве переменной для хранения четырех переменных ‘int’

Нет, это плохая идея ™ по целому ряду причин.

  1. Это было бы крайне неэффективно

  2. Очень трудно читать

  3. (следовательно) очень сложно отлаживать

Конечно, это может сэкономить несколько байтов здесь и там, но, честно говоря, в наши дни я покупаю свои модули оперативной памяти в гигабайтах.

Мое предложение:

Напишите всю свою шахматную программу. Если вы столкнетесь с проблемами производительности, профилируйте программу, чтобы увидеть, где находятся бутылочные горлышки, и сделайте что-нибудь с ними. (Я могу гарантировать вам, что вы не начнете упаковывать несколько чисел в an int , как только достигнете этой точки.)

Комментарии:

1. Я написал большую часть своей программы, и я не хочу снова писать очень большие ее части. Вот почему я спросил. Я начну профилирование через несколько дней, когда исправлю серьезную ошибку. Спасибо!

2. Очень хороший ответ. Я согласен с каждым словом. Я просто хочу добавить, что вопрос является классическим примером преждевременной оптимизации.

Ответ №2:

Если вы просто хотите сохранить некоторые флаги, вы можете использовать BitSet, например. Если это данные, я поддерживаю ответ aioobe.

Комментарии:

1. Я действительно не хочу создавать какие-либо объекты, потому что все, что я делаю, будет повторяться около 10 миллионов раз при поиске в моем шахматном дереве возможных ходов… И координаты на самом деле не являются флагами, они сильно меняются и передаются туда и обратно между методами.

2. Хорошо, я понял. Тогда вы можете подумать о создании объекта «Context» или «Arguments» один раз и поделиться этим экземпляром с вашими 10 миллионами вызовов…

Ответ №3:

Как сказал Алан Кей,

«Заставьте это работать, сделайте это правильно, сделайте это быстро, сделайте это дешево»

Как только программа заработает, измерьте ее, чтобы выяснить, что работает медленно или что занимает слишком много места. Затем вы можете принять обоснованное решение о том, что вам нужно оптимизировать.