在使用aws-sdk-cpp时,都有一个初始化的过程,配置信息都由Aws::Client::ClientConfiguration创建对象配置服务器信息才能实现上传,下载文件,本篇记录在使用过程中Aws::Client::ClientConfiguration创建对象时耗时长的问题。
首先看示例代码:
void MainWindow::getBucketTest()
{
// 初始化
qDebug() << "getBucketTest===========1===========" << PRINTTIME;
Aws::SDKOptions options;
options.loggingOptions.logLevel = Aws::Utils::Logging::LogLevel::Debug;
Aws::InitAPI(options);
qDebug() << "getBucketTest===========2====start===sizeof(Aws::Client::ClientConfiguration)===="
<< sizeof(Aws::Client::ClientConfiguration) << PRINTTIME;
Aws::Client::ClientConfiguration cfg;
qDebug() << "getBucketTest===========2====end=====sizeof(Aws::Client::ClientConfiguration)===="
<< sizeof(Aws::Client::ClientConfiguration) << PRINTTIME;
cfg.endpointOverride = "play.min.io";//官方测试服务器
cfg.scheme = Aws::Http::Scheme::HTTPS; //https协议
//cfg.scheme = Aws::Http::Scheme::HTTP; //http协议
//cfg.verifySSL = false;
qDebug() << "getBucketTest==========3============" << PRINTTIME;
Aws::Auth::AWSCredentials cred("Q3AM3UQ867SPQQA43P2F", "zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG");
qDebug() << "getBucketTest==========4============" << PRINTTIME;
Aws::S3::S3Client client(cred, cfg, Aws::Client::AWSAuthV4Signer::PayloadSigningPolicy::Always, false,
Aws::S3::US_EAST_1_REGIONAL_ENDPOINT_OPTION::NOT_SET);
qDebug() << "getBucketTest==========5============" << PRINTTIME;
auto response = client.ListBuckets();
qDebug() << "getBucketTest==========6============" << PRINTTIME;
if (response.IsSuccess()) {
auto buckets = response.GetResult().GetBuckets();
for (auto iter = buckets.begin(); iter != buckets.end(); ++iter) {
cout << iter->GetName() << "\t" << iter->GetCreationDate().ToLocalTimeString(Aws::Utils::DateFormat::ISO_8601) << endl;
}
}
qDebug() << "getBucketTest==========7============" << PRINTTIME;
Aws::ShutdownAPI(options);
}
运行结果:
从上面可以看出Aws::Client::ClientConfiguration创建cfg对象时耗时24秒,这个类564个字节,这是32位环境,64位环境时这个类还到936个字节。
struct AWS_CORE_API ClientConfiguration
{
ClientConfiguration();
/**
* Create a configuration with default settings. By default IMDS calls are enabled.
* @param ClientConfigurationInitValues ClientConfiguration initial customizable values
*/
ClientConfiguration(const ClientConfigurationInitValues &configuration);
/**
* Create a configuration based on settings in the aws configuration file for the given profile name.
* The configuration file location can be set via the environment variable AWS_CONFIG_FILE
* @param profileName the aws profile name.
* @param shouldDisableIMDS whether or not to disable IMDS calls.
*/
ClientConfiguration(const char* profileName, bool shouldDisableIMDS = false);
/**
* Create a configuration with a predefined smart defaults
* @param useSmartDefaults, required to differentiate c-tors
* @param defaultMode, default mode to use
* @param shouldDisableIMDS whether or not to disable IMDS calls.
*/
explicit ClientConfiguration(bool useSmartDefaults, const char* defaultMode = "legacy", bool shouldDisableIMDS = false);
......
};
ClientConfiguration有4个构造函数,我们用的是默认的无参构造函数,后面几个函数还没使用过呢,其中第三个构造函数很特点,有一个参数shouldDisableIMDS whether or not to disable IMDS calls.是否禁用IMDS,这个才是耗时的关键,如果不禁用IMDS就会分析数据安全性,耗时。
因此,这里如果把这个IMDS禁用了,创建速度就很速度了,看示例:
void MainWindow::getBucketTest()
{
// 初始化
qDebug() << "getBucketTest===========1===========" << PRINTTIME;
Aws::SDKOptions options;
options.loggingOptions.logLevel = Aws::Utils::Logging::LogLevel::Debug;
Aws::InitAPI(options);
qDebug() << "getBucketTest===========2====start===sizeof(Aws::Client::ClientConfiguration)===="
<< sizeof(Aws::Client::ClientConfiguration) << PRINTTIME;
Aws::Client::ClientConfiguration cfg("default", true);
qDebug() << "getBucketTest===========2====end=====sizeof(Aws::Client::ClientConfiguration)===="
<< sizeof(Aws::Client::ClientConfiguration) << PRINTTIME;
cfg.endpointOverride = "play.min.io"; //官方测试服务器
cfg.scheme = Aws::Http::Scheme::HTTPS; //https协议
//cfg.scheme = Aws::Http::Scheme::HTTP; //http协议
//cfg.verifySSL = false;
qDebug() << "getBucketTest==========3============" << PRINTTIME;
Aws::Auth::AWSCredentials cred("Q3AM3UQ867SPQQA43P2F", "zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG");
qDebug() << "getBucketTest==========4============" << PRINTTIME;
Aws::S3::S3Client client(cred, cfg, Aws::Client::AWSAuthV4Signer::PayloadSigningPolicy::Always, false,
Aws::S3::US_EAST_1_REGIONAL_ENDPOINT_OPTION::NOT_SET);
qDebug() << "getBucketTest==========5============" << PRINTTIME;
auto response = client.ListBuckets();
qDebug() << "getBucketTest==========6============" << PRINTTIME;
if (response.IsSuccess()) {
auto buckets = response.GetResult().GetBuckets();
for (auto iter = buckets.begin(); iter != buckets.end(); ++iter) {
cout << iter->GetName() << "\t" << iter->GetCreationDate().ToLocalTimeString(Aws::Utils::DateFormat::ISO_8601) << endl;
}
}
qDebug() << "getBucketTest==========7============" << PRINTTIME;
Aws::ShutdownAPI(options);
}
运行结果:
Aws::Client::ClientConfiguration cfg("default", true);这样创建对象,基本就不耗时了。
参考:
Aws::Client::ClientConfiguration default construction is very slow · aws/aws-sdk-cpp · Discussion #2398 · GitHub