void bfv_performance_test(shared_ptr context)
chrono::high_resolution_clock::time_point time_start, time_end;
打印参数
print_parameters(context);
cout << endl;
auto &parms = context->first_context_data()->parms();
auto &plain_modulus = parms.plain_modulus();
size_t poly_modulus_degree = parms.poly_modulus_degree();
生成公私钥 for context
cout << "Generating secret/public keys: ";
KeyGenerator keygen(context);
cout << "Done" << endl;
auto secret_key = keygen.secret_key();
auto public_key = keygen.public_key();
RelinKeys relin_keys;
GaloisKeys gal_keys;
时间
chrono::microseconds time_diff;
if (context->using_keyswitching())
{
// Generate relinearization keys.
cout << "Generating relinearization keys: ";
time_start = chrono::high_resolution_clock::now();
relin_keys = keygen.relin_keys();
time_end = chrono::high_resolution_clock::now();
time_diff = chrono::duration_cast<chrono::microseconds>(time_end - time_start);
cout << "Done [" << time_diff.count() << " microseconds]" << endl;
if (!context->key_context_data()->qualifiers().using_batching)
{
cout << "Given encryption parameters do not support batching." << endl;
return;
}
生成伽罗瓦键。在更大的示例中,Galois键可以使用大量内存,这在受限的系统中可能是一个问题。
用户应该尝试一些较 大的测试运行,并观察它们对内存池分配大小的影响。从打印结果可以看出,
密钥生成也需要很长时间
cout << "Generating Galois keys: ";
time_start = chrono::high_resolution_clock::now();
gal_keys = keygen.galois_keys();
time_end = chrono::high_resolution_clock::now();
time_diff = chrono::duration_cast<chrono::microseconds>(time_end - time_start);
cout << "Done [" << time_diff.count() << " microseconds]" << endl;
}
Encryptor encryptor(context, public_key);
Decryptor decryptor(context, secret_key);
Evaluator evaluator(context);
BatchEncoder batch_encoder(context);
IntegerEncoder encoder(context);
这些将保存每个操作使用的总时间。
chrono::microseconds time_batch_sum(0);
chrono::microseconds time_unbatch_sum(0);
chrono::microseconds time_encrypt_sum(0);
chrono::microseconds time_decrypt_sum(0);
chrono::microseconds time_add_sum(0);
chrono::microseconds time_multiply_sum(0);
chrono::microseconds time_multiply_plain_sum(0);
chrono::microseconds time_square_sum(0);
chrono::microseconds time_relinearize_sum(0);
chrono::microseconds time_rotate_rows_one_step_sum(0);
chrono::microseconds time_rotate_rows_random_sum(0);
chrono::microseconds time_rotate_columns_sum(0);
How many times to run the test?
int count = 10;
填充要进行批处理的值向量
size_t slot_count = batch_encoder.slot_count();
vector<uint64_t> pod_vector;
random_device rd;
for (size_t i = 0; i < slot_count; i++)
{
pod_vector.push_back(rd() % plain_modulus.value());
}
cout << "Running tests ";