Размер значения влияет на время расчета? - PullRequest
1 голос
/ 02 декабря 2011

Скажем, у меня есть программа на Java, такая:

//case1
Long first = 1;
Long second = 1;
Long third = first - second;

//case2
Long first = Long.MAX_VALUE;
Long second = 100000L;
Long third = first - second;

Эти два случая должны иметь одинаковое время выполнения и накладные расходы, не так ли? Фактическая операция выполняется для каждого бита в правом Long, независимо от значения, содержащегося в нем, верно?

Если мое предположение верно, есть ли язык, на котором это НЕ так?

РЕДАКТИРОВАТЬ: Случай, который вызвал это 16-разрядный PIC, который мы используем на работе (код C), который вычисляет средние значения за переменное количество времени. После ответов, приведенных ниже от M S и Thom, я теперь понимаю, что возможно ввести ошибку таким образом, поскольку PIC вычисляет критически важную информацию с учетом времени.

Спасибо всем большое.

Ответы [ 4 ]

2 голосов
/ 02 декабря 2011

То, что вы говорите, верно в Java - операции выполняются за время, не зависящее от значений.В некоторых языках (таких как Lisp), если значение превышает максимально допустимое значение для типа данных, выполнение автоматически переключается на использование пакета с большим целым числом, что значительно замедляет выполнение.

РЕДАКТИРОВАТЬ Существует небольшая разница между первым и вторым случаями: значение 1 является специальным (как и 0).Байт-код для

Long first=1L;

:

lconst_1
invokestatic    #2; //Method java/lang/Long.valueOf:(J)Ljava/lang/Long;
astore_1

, тогда как если константа равна (скажем) 2L, можно получить этот байт-код:

ldc2_w  #3; //long 2l
invokestatic    #2; //Method java/lang/Long.valueOf:(J)Ljava/lang/Long;
astore_2

Так какlconst_1 работает быстрее, чем ldc2_w, есть небольшая разница во времени между случаями 1 и 2.

1 голос
/ 02 декабря 2011

Возможно, это не ответ, но на 32-битном компьютере 64-битные значения не являются поточно-ориентированными, поскольку они должны поместить половину значения в регистр и вычислить, а затем другую половину. Может быть оптимизация, которая будет игнорировать часть всех нулей значения и, следовательно, будет быстрее для меньших чисел.

1 голос
/ 02 декабря 2011

Это не зависит от языка, скорее это зависит от базового оборудования.Размер регистра и ширина шины данных.

Например, если Long.MAX_VALUE больше 16 бит на 16-битной машине, требуется 2 цикла для загрузки данных в память, поэтому для случая 1 и случая 2 будет разное время выполнения.

обычно эти максимальные значения устанавливаются в соответствии с размером бита станка

1 голос
/ 02 декабря 2011

Я не знаю ни одного, но я мог бы представить язык, который просто имеет "целочисленный" тип данных, который изменяет размер целого числа по мере необходимости, заставляя маленькие числа быть быстрее, чем большие числа. (Рассмотрим класс Java BigInteger).

Что касается кода, который у вас есть, то производительность не будет точно такой же, за исключением небольшого , поскольку вы используете Long вместо long, вы получите предварительно сделал Long для first и second, тогда как остальные должны быть созданы во втором примере.

Если бы вы использовали такие значения, как 200 и 201 в первом примере, а 10000000000 и 100000000001 во втором, они были бы идентичны.

...