Удвоиться до международного преобразования позади сцены?

Мне просто любопытно знать то, что, оказывается, позади сцены преобразовывает вдвое большее по сравнению с интервалом, говорит интервал (5666.1)? Будет этим более дорогим, чем static_cast дочернего класса для порождения? Начиная с представления интервала и дважды существенно отличаются, там будет временными файлами, созданными во время процесса и дорогими также.

12
задан yesraaj 3 February 2010 в 06:15
поделиться

3 ответа

Назовите меня человеком краткости...

Я бы предпочел, чтобы в этом случае использовался метод $ .post () . Если вы не используете более эзотерические варианты в $ .ajax () , я не вижу причин использовать его, когда имеются более короткие и сжатые методы:

$.post("/Controller/action", { myObjectOrParameters }, function(data) {
  alert(data);
});
-121--4631762-

Вы можете вызвать основной метод любого класса напрямую. Например, если у вас есть класс Server и Client и вы хотите запустить один сервер и два клиента, вот что вы можете сделать.

public class Server {
    public void main(final String ... $Args) {
         final Server S = new Server();
         S.config($Args);
         S.run();
    }
}

public class Client {
    public void main(final String ... $Args) {
         final Client C = new Client();
         C.config($Args);
         C.run();
    }
}

public class Test_ServerClient {
    public void main(final String ... $Args) {
         Server.main('server1.cfg');
         Client.main('client1.cfg');
         Client.main('client2.cfg');
    }
}

Готово!

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

Но можно подумать. Все серверы и клиенты будут запускаться на одном JVM. В большинстве случаев (если вы просто хотите проверить его взаимодействие и не имеете ничего общего с загрузкой класса, так как это будет вести себя по-другому, когда они находятся/не находятся на одном JVM), это должно быть хорошо. Если вы действительно хотите, чтобы он был запущен на разных JVM, вы можете использовать Ant, чтобы запустить их вместо этого.

Что-то вроде этого:

<project name="TestServerClient" default="test" basedir=".">
  <target name="test">
       <java classname="my.Server">
         <arg value="server1.cfg"/>
         <classpath>
           <pathelement location="dist/test.jar"/>
           <pathelement path="${java.class.path}"/>
         </classpath>
       </java>
       <java classname="my.Client">
         <arg value="client1.cfg"/>
         <classpath>
           <pathelement location="dist/test.jar"/>
           <pathelement path="${java.class.path}"/>
         </classpath>
       </java>
       <java classname="my.Client">
         <arg value="client2.cfg"/>
         <classpath>
           <pathelement location="dist/test.jar"/>
           <pathelement path="${java.class.path}"/>
         </classpath>
       </java>
  </target>
</project>

Так что вы можете просто запустить этого муравья и вот он.

Надеюсь, это поможет.

-121--2470102-

Любой ЦП с собственной плавающей точки будет иметь команду на преобразование данных с плавающей запятой в целочисленные данные. Эта операция может занять от нескольких циклов до многих. Обычно существуют отдельные регистры CPU для FP и целых чисел, так что вы также должны впоследствии переместить целое число в целочисленный регистр, прежде чем вы можете использовать его. Это может быть еще одна операция, возможно, дорогая. Ознакомьтесь с руководством по процессорам.

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

В случае отсутствия аппаратной поддержки FP номер должен быть декодирован. Формат IEEE FP:

sign | exponent + bias | mantissa

Чтобы конвертировать, нужно сделать что-то вроде

// Single-precision format values:
int const mantissa_bits = 23; // 52 for double.
int const exponent_bits = 8; // 11 for double.
int const exponent_bias = 127; // 1023 for double.

std::int32_t ieee;
std::memcpy( & ieee, & float_value, sizeof (std::int32_t) );
std::int32_t mantissa = ieee & (1 << mantissa_bits)-1 | 1 << mantissa_bits;
int exponent = ( ieee >> mantissa_bits & (1 << exponent_bits)-1 )
             - ( exponent_bias + mantissa_bits );
if ( exponent <= -32 ) {
    mantissa = 0;
} else if ( exponent < 0 ) {
    mantissa >>= - exponent;
} else if ( exponent + mantissa_bits + 1 >= 32 ) {
    overflow();
} else {
    mantissa <<= exponent;
}
if ( ieee < 0 ) mantissa = - mantissa;
return mantissa;

То есть несколько бит команд распаковки и сдвига.

18
ответ дан 2 December 2019 в 05:54
поделиться

static_cast зависит от генерации кода C ++ компилятором, но обычно не требует затрат времени выполнения, поскольку изменение указателя вычисляется во время компиляции на основе предполагаемой информации в приведении.

Когда вы конвертируете double в int, в системе x86 компилятор сгенерирует инструкцию FIST (преобразование с плавающей точкой в ​​целое число), и FPU выполнит преобразование. Это преобразование может быть реализовано программно и выполняется таким образом на определенном оборудовании или, если этого требует программа. Библиотека GNU MPFR способна выполнять двойное преобразование в int и выполнять такое же преобразование на всем оборудовании.

4
ответ дан 2 December 2019 в 05:54
поделиться

Если генератор кода использует набор инструкций Intel SSE2, то всегда есть выделенная команда FPU, которая выполняет работу, cvttsd2si. Это быстро, но не так быстро, как статический гипс. Обычно для этого вообще не требуется никакого кода.

4
ответ дан 2 December 2019 в 05:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: