Скорость: четыре целых или одно целое со многими операциями - PullRequest
1 голос
/ 17 октября 2011

У меня есть вопрос скорости для 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' или просто использовать переменные.

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

Ответы [ 3 ]

7 голосов
/ 17 октября 2011

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

Нет, это Плохая идея & trade; по ряду причин.

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

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

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

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

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

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

0 голосов
/ 17 октября 2011

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

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

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

0 голосов
/ 17 октября 2011

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

...