Почему Java проверяет мне цифровую подпись ECDSA SHA-256 быстрее, чем C ++?

Я написал 2 прикладные программы, один в JAVA и другом в C ++, что главным образом производят пару ключей, лишенную и публичная, чтобы далее подписывать сообщение с уборной и это проверять после с публичной. В обоих случаях я измеряю время, которое медлит с тем, чтобы делать вышеупомянутое себе проверкой и удивительно выходит у меня, что JAVA делает это более быстрым что C ++ (2 миллисекунды напротив 2.5 миллисекунд), что мне кажется приводящим в замешательство и - противоположность, чего он надеялся получить, эти времена - средний показатель, большое число раз сделало эту операцию раньше внутри цикла for. Это коды:

JAVA:

public static double ecdsa() throws Exception {
/*
 * Generate an ECDSA signatures
 */

/*
 * Generate a key pair
 */
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("EC");

ECGenParameterSpec kk = new ECGenParameterSpec("secp256r1");

keyGen.initialize(kk);

KeyPair pair = keyGen.generateKeyPair();
PrivateKey priv = pair.getPrivate();
PublicKey pub = pair.getPublic();
/*
 * Create a Signature object and initialize it with the private key
 */

Signature dsa = Signature.getInstance("SHA256withECDSA");
dsa.initSign(priv);

String str = "This is string to sign";
byte[] strByte = str.getBytes("UTF-8");

dsa.update(strByte);

/*
 * Now that all the data to be signed has been read in, generate a
 * signature for it
 */
byte[] realSig = dsa.sign();
long startTime = System.nanoTime();

dsa.initVerify(pub);
dsa.update(strByte);
boolean res = dsa.verify(realSig);

long endTime = System.nanoTime();

double elapsedTime = (double) ((endTime - startTime) / Math.pow(10, 6));

return elapsedTime;
}

C ++:

long double ecdsa_sample()
{
//Prepare ecdsa stuff

AutoSeededRandomPool prng;
ByteQueue privateKey, publicKey;

string message = "This is string to sign";

// Generate private key
ECDSA<ECP, SHA256>::PrivateKey privKey;
privKey.Initialize( prng, ASN1::secp256r1() );
privKey.Save( privateKey );

// Create public key
ECDSA<ECP, SHA256>::PublicKey pubKey;
privKey.MakePublicKey( pubKey );
pubKey.Save( publicKey );

//////////////////////////////////////////////////////    

// Load SHA256 key (in ByteQueue, PKCS#8 format)
ECDSA<ECP, SHA256>::Signer signer( privateKey );

// Determine maximum size, allocate a string with that size
size_t siglen = signer.MaxSignatureLength();
string signature(siglen, 0x00);

// Sign, and trim signature to actual size
siglen = signer.SignMessage( prng, (const byte*)message.data(), message.size(), (byte*)signature.data() );
signature.resize(siglen);

////////////////////////////////////////////////////// 

// Load public key (in ByteQueue, X509 format)
ECDSA<ECP, SHA256>::Verifier verifier( publicKey );

long double startecdsa_verification = getTime();

bool result = verifier.VerifyMessage( (const byte*)message.data(), message.size(), (const byte*)signature.data(), signature.size() );

//    if(result)
//        cout << "Verified signature on message" << endl;
//    else
//        cerr << "Failed to verify signature on message" << endl;

long double endecdsa_verification = getTime();

return (endecdsa_verification - startecdsa_verification);
}

Мой вопрос, почему он может перемещать это? Может быть, инструкция, которая используется в C ++, делает больше операций, что операция JAVA или что-то из-за стиля, но казаться обоими они делают то же самое мне. Мне нужно, чтобы оба scripts сделали то же самое, чтобы мочь сравнивать выступления в обоих языках операции проверки, и в меня казаться C ++ должно бы быть всегда быстрее, чем JAVA. Спасибо!

6
задан 25.01.2017, 22:49
0 ответов

Давно уже не верно, что под реальными условиями Java был бы более медленным, чем C ++. Существуют доказательства, которые они показывают, что в нескольких случаях использования (даже не во всех) этот Java на том же уровне результата или даже выше, что C ++.

Удивительный?

Объяснение, - в котором Java производит bytecode, который составлен в моменте, который загружает приложение в виртуальной машине в том же компьютере, в котором он прокручивает изображение в окне, и виртуальная машина оптимизирует постоянно код, принимая во внимание все особенности системы как числа основ, тип процессора, и т.д.

Оптимизация C ++, наоборот, находится более низкий контроль разработчика в машине, в которой он работает, и не обязательно быть оптимизированным в течение runtime.

Если ты делаешь доказательство измеряя время выполнения метода в Java, ты поймешь, что первое выполнение опаздывает гораздо больше, чем следующие, и что какие-то методы продолжают работать быстрее со времени, благодаря оптимизации в реальном времени, которое только парадигма JIT compiler (just in я украл, справедливый составитель вовремя) может предлагать.

9
ответ дан 03.12.2019, 17:30
  • 1
    " Я участвую в рыцарском турнире в tiempo" serí в traducció n приемлемый. –  25.01.2017, 22:49
  • 2
    optimizació n C ++, наоборот, está má s под контролем разработчика в má хина, в которой он работает, и не обязательно оптимизирован в течение runtime . В самом деле, optimizació n C ++ никогда не будет встречаться во времени ejecució n. –  26.01.2017, 10:57

Теги

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