C++ 加速类构造函数C++;

C++ 加速类构造函数C++;,c++,c++11,C++,C++11,所以我正在为我编写的系统进行速度测试。为此,我编写了自己的DateTime命名空间,因为我需要比ctime更多的控制,并且不想绑定到系统时间。在我的测试中,我发现DateTimeParse和TimeZoneSpec类的构造函数正在减慢DateTime对象的构造速度,即使这大约需要3.4E-5秒,这是200k的总和 有两个构造函数花费的时间大致相同。第一种方法创建格式说明符的映射,类似于存储其边界和类型的strtime格式(即%z,%Y),并使用std::function将getter和sette

所以我正在为我编写的系统进行速度测试。为此,我编写了自己的DateTime命名空间,因为我需要比ctime更多的控制,并且不想绑定到系统时间。在我的测试中,我发现DateTimeParse和TimeZoneSpec类的构造函数正在减慢DateTime对象的构造速度,即使这大约需要3.4E-5秒,这是200k的总和

有两个构造函数花费的时间大致相同。第一种方法创建格式说明符的映射,类似于存储其边界和类型的strtime格式(即%z,%Y),并使用std::function将getter和setter(在适用情况下)绑定到适当的函数

DateTimeParse::DateTimeParse()
{
  m_map.insert(std::unordered_map<std::string,DateTimeFormat>::value_type("Y",DateTimeFormat('Y',4,"int",1970,3000,std::bind(&DateTimeParse::_set_year, this, std::placeholders::_1, std::placeholders::_2), std::bind(&DateTimeParse::_get_year, this, std::placeholders::_1))));
  m_map.insert(std::unordered_map<std::string, DateTimeFormat>::value_type("m",DateTimeFormat('m',2,"int",1,12,std::bind(&DateTimeParse::_set_month, this, std::placeholders::_1, std::placeholders::_2), std::bind(&DateTimeParse::_get_month, this, std::placeholders::_1))));
  m_map.insert(std::unordered_map<std::string, DateTimeFormat>::value_type("d",DateTimeFormat('d',2,"int",1,31,std::bind(&DateTimeParse::_set_day, this, std::placeholders::_1, std::placeholders::_2), std::bind(&DateTimeParse::_get_day, this, std::placeholders::_1))));
  m_map.insert(std::unordered_map<std::string, DateTimeFormat>::value_type("H",DateTimeFormat('H',2,"int",0,23,std::bind(&DateTimeParse::_set_hour, this, std::placeholders::_1, std::placeholders::_2), std::bind(&DateTimeParse::_get_hour, this, std::placeholders::_1))));
  m_map.insert(std::unordered_map<std::string, DateTimeFormat>::value_type("M",DateTimeFormat('M',2,"int",0,59,std::bind(&DateTimeParse::_set_min, this, std::placeholders::_1, std::placeholders::_2), std::bind(&DateTimeParse::_get_min, this, std::placeholders::_1))));
  m_map.insert(std::unordered_map<std::string, DateTimeFormat>::value_type("S",DateTimeFormat('S',2,"int",0,59,std::bind(&DateTimeParse::_set_sec, this, std::placeholders::_1, std::placeholders::_2), std::bind(&DateTimeParse::_get_sec, this, std::placeholders::_1))));
  m_map.insert(std::unordered_map<std::string, DateTimeFormat>::value_type("Z",DateTimeFormat('Z',3,"string",0,0,std::bind(&DateTimeParse::_set_tz, this, std::placeholders::_1, std::placeholders::_2), std::bind(&DateTimeParse::_get_tz, this, std::placeholders::_1))));
  m_map.insert(std::unordered_map<std::string, DateTimeFormat>::value_type("a",DateTimeFormat('a',3,"string",0,0, std::bind(&DateTimeParse::_get_weekday_abbr, this, std::placeholders::_1))));
  m_map.insert(std::unordered_map<std::string, DateTimeFormat>::value_type("A",DateTimeFormat('A',0,"string",0,0, std::bind(&DateTimeParse::_get_weekday_full, this, std::placeholders::_1))));
  m_map.insert(std::unordered_map<std::string, DateTimeFormat>::value_type("b",DateTimeFormat('b',3,"string",0,0, std::bind(&DateTimeParse::_get_month_abbr, this, std::placeholders::_1))));
  m_map.insert(std::unordered_map<std::string, DateTimeFormat>::value_type("B",DateTimeFormat('B',0,"string",0,0, std::bind(&DateTimeParse::_get_month_full, this, std::placeholders::_1))));
  m_map.insert(std::unordered_map<std::string, DateTimeFormat>::value_type("j",DateTimeFormat('j',3,"string",1,366,std::bind(&DateTimeParse::_set_julian, this, std::placeholders::_1, std::placeholders::_2), std::bind(&DateTimeParse::_get_julian, this, std::placeholders::_1))));
  m_map.insert(std::unordered_map<std::string, DateTimeFormat>::value_type("z",DateTimeFormat('z',3,"string",0,99,std::bind(&DateTimeParse::_set_tz_with_offset, this, std::placeholders::_1, std::placeholders::_2), std::bind(&DateTimeParse::_get_tz_with_offset, this, std::placeholders::_1))));
  m_map.insert(std::unordered_map<std::string, DateTimeFormat>::value_type("s",DateTimeFormat('s',10,"ulint",static_cast<unsigned long int>(0),static_cast<unsigned long int>(4294967295),std::bind(&DateTimeParse::_set_epoch, this, std::placeholders::_1, std::placeholders::_2), std::bind(&DateTimeParse::_get_epoch, this, std::placeholders::_1))));
};
DateTimeParse::DateTimeParse()
{
m_map.insert(std::unordered_map::value_type(“Y”,DateTimeFormat('Y',4,“int”,19703000,std::bind(&DateTimeParse::_set_year,this,std::placeholders::_1,std::placeholders::_2),std::bind(&DateTimeParse:_get_year,this,std::placeholders:_1));
m_map.insert(std::unordered_map::value_type(“m”,DateTimeFormat('m',2,“int”,1,12,std::bind(&DateTimeParse::_set_month,this,std::占位符::_1,std::占位符::_2),std::bind(&DateTimeParse:_get_month,this,std::占位符::_1));
m_map.insert(std::unordered_map::value_type(“d”,DateTimeFormat('d',2,“int”,1,31,std::bind(&DateTimeParse::_set_day,this,std::placeholders::_1,std::placeholders::_2),std::bind(&DateTimeParse:_get_day,this,std::placeholders::_1)));
m_map.insert(std::unordered_map::value_type(“H”,DateTimeFormat('H',2,“int”,0,23,std::bind(&DateTimeParse::_set_hour,this,std::占位符::_1,std::占位符::_2),std::bind(&DateTimeParse:_get_hour,this,std::占位符::_1));
m_map.insert(std::unordered_map::value_type(“m”,DateTimeFormat('m',2,“int”,0,59,std::bind(&DateTimeParse::_set_min,this,std::占位符::_1,std::占位符::_2),std::bind(&DateTimeParse:_get_min,this,std::占位符::_1));
m_map.insert(std::unordered_map::value_type(“S”,DateTimeFormat('S',2,“int”,0,59,std::bind(&DateTimeParse::_set_sec,this,std::占位符::_1,std::占位符::_2),std::bind(&DateTimeParse:_get_sec,this,std::占位符::_1));
m_map.insert(std::unordered_map::value_type(“Z”,DateTimeFormat('Z',3,“string”,0,0,std::bind(&DateTimeParse:::_set_tz,this,std::占位符::_1,std::占位符::_2),std::bind(&DateTimeParse:_get_tz,this,std::占位符::_1));
m_map.insert(std::unordered_map::value_type(“a”,DateTimeFormat('a',3,“string”,0,0,std::bind(&DateTimeParse::_get_weekday_abbr,this,std::placeholders::_1));
m_map.insert(std::unordered_map::value_type(“A”,DateTimeFormat('A',0,“string”,0,0,std::bind(&DateTimeParse::_get_weekday_full,this,std::placeholders::_1));
m_map.insert(std::unordered_map::value_type(“b”,DateTimeFormat('b',3,“string”,0,0,std::bind(&DateTimeParse::_get_month_abbr,this,std::placeholders::_1));
m_map.insert(std::unordered_map::value_type(“B”,DateTimeFormat('B',0,“string”,0,0,std::bind(&DateTimeParse::_get_month_full,this,std::placeholders::_1));
m_map.insert(std::unordered_map::value_type(“j”,DateTimeFormat('j',3,“string”,1366,std::bind(&DateTimeParse::_set_julian,this,std::占位符::_1,std::占位符::_2),std::bind(&DateTimeParse:_get_julian,this,std::占位符::_1));
m_-map.insert(std::unordered_-map::value_-type(“z”,DateTimeFormat('z',3,“string”,0,99,std::bind(&DateTimeParse:::_-set_-tz_与_-offset,this,std::占位符::_1,std::占位符::_2),std::bind(&DateTimeParse:_-get_-tz_与_-offset,this,std::占位符::_-1)));
m_-map.insert(std::unordered_-map::value_type(“s”、DateTimeFormat('s',10,“ulint”)、static_-cast(0)、static_-cast(4294967295)、std::bind(和DateTimeParse::_-set_-epoch,this,std::占位符::_1,std::占位符::_2)、std::bind(&DateTimeParse:_-get_-epoch,this,std::占位符::_-1)));
};
以上内容存储在std::map中

第二个构造函数创建包含时区规范的std::vector>

TimeZoneSpec::TimeZoneSpec()
{
  std::vector<std::string> tz;
  std::vector<std::vector<std::string> > tzdb;

  tz = {"Greenwich, London","UTC","Coordinated Universal Time","","","-00:00:00","","","","",""};
  tzdb.push_back(tz);
  tz.clear();
  tz = {"Greenwich, London","UTC","Coordinated Universal Time","","","+00:00:00","","","","",""};
  tzdb.push_back(tz);
  tz.clear();
  tz = {"Greenwich, London","GMT","Greenwich Mean Time","","","00:00:00","","","","",""};
  tzdb.push_back(tz);
  tz.clear();
  tz = {"America/New_York","EST","Eastern Standard Time","EDT","Eastern Daylight Time","-05:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"};
  tzdb.push_back(tz);
  tz.clear();
  tz = {"America/Chicago","CST","Central Standard Time","CDT","Central Daylight Time","-06:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"};
  tzdb.push_back(tz);
  tz.clear();
  tz = {"America/Denver","MST","Mountain Standard Time","MDT","Mountain Daylight Time","-07:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"};
  tzdb.push_back(tz);
  tz.clear();
  tz = {"America/Los_Angeles","PST","Pacific Standard Time","PDT","Pacific Daylight Time","-08:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"};
  tzdb.push_back(tz);
  tz.clear();
  tz = {"America/Anchorage","AKST","AKST","AKDT","AKDT","-09:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"};
  tzdb.push_back(tz);
  tz.clear();
  tz = {"America/Adak","HAST","HAST","HADT","HADT","-10:00:00","+01:00:00","2;0;3","+02:00:00","1;0;11","+02:00:00"};
  tzdb.push_back(tz);
  tz.clear();
  tz = {"America/Phoenix","MST","Mountain Standard Time","","","-07:00:00","+00:00:00","","","","+00:00:00"};
  tzdb.push_back(tz);
  tz.clear();

  m_tzdb = tzdb;
  };
TimeZoneSpec::TimeZoneSpec()
{
std::向量tz;
std::矢量tzdb;
tz={“格林威治,伦敦”,“UTC”,“协调世界时”,“协调世界时”,“协调世界时”,“协调世界时”,“协调世界时”,“协调世界时”-00:00:00”,“协调世界时”,“协调世界时”,“协调世界时”,“协调世界时”,“协调世界时”,“协调世界时”,“协调世界时”,“协调世界时”,协调世界时,协调世界时,协调世界时,协调世界时,协调;
tzdb.推回(tz);
tz.clear();
tz={“格林威治,伦敦”,“UTC”,“协调世界时”,“协调世界时”,“协调世界时”,“协调世界时”,“协调世界时”,“协调世界时”,“协调世界时”,“协调世界时”,“协调世界时”,“协调世界时”,“协调世界时”,“协调世界时”,“协调世界时”,“协调世界时”,“协调世界时”,“协调世界时”,“协调世界时”,“协调世界时”,“协调世界时”,协调世界时;
tzdb.推回(tz);
tz.clear();
tz={“格林威治,伦敦”,“格林威治标准时间”,“格林威治标准时间”,“格林威治标准时间”,“格林威治标准时间”,“格林威治标准时间”,“格林威治标准时间”,“格林威治标准时间”,“格林威治标准时间”,“格林威治标准时间”,“格林威治标准时间”,“格林威治标准时间”,“格林威治标准时间”,“格林威治标准时间”,“格林威治标准时间;
tzdb.推回(tz);
tz.clear();
tz={“美国/纽约州”、“东部标准时间”、“东部标准时间”、“东部夏令时”、“东部夏令时”、“东部夏令时”、“东部夏令时”、“-05:00:00”、“东部夏令时”、“+01:00:00”、“东部夏令时”、“+02:00:00”、“东部夏令时”、“+02:00:00”};
tzdb.推回(tz);
tz.clear();
tz={“美国/芝加哥”、“CST”、“中央标准时间”、“CDT”、“中央夏时制”、“零六点零零分”、“零一点零零分”、“零二点零零分”、“零一点零零分”、“零二点零零分”、“零一点零零分”、“零二点零零分”};
tzdb.推回(tz);
tz.clear();
tz={“美国/丹佛”、“MST”、“山地标准时间”、“MDT”、“山地昼时”、“07:00:00”、“+01:00:00”、“2;0;3”、“+02:00:00”、“1;0;11”、“+02:00:00”};
tzdb.推回(tz);
tz.clear();
tz={“美国/洛杉矶”、“太平洋标准时间”、“太平洋标准时间”、“太平洋标准时间”、“太平洋夏令时”、“太平洋夏令时”、“-08:00:00”、“+01:00:00”、“2;0;3”、“+02:00:00”、“1;0;11”、“+02:00:00”};
tzdb.推回(tz);
tz.clear();
tz={“美国/安克雷奇”,“AKST”,“AKST”,“AKDT”,“AKDT”,“-09:00:00”,“+01:00:00”,“2;0;3”,“+02:00:00”,“1;0;11”,“+02:00:00”};
tzdb.推回(tz);
tz.clear();
tz={“美国/阿达克”,“哈斯”,“哈斯”,“哈特”,“哈特”,“哈特”,“10:00:00”,“+01:00:00”,“2;0;3”,“+02:00:00”,“1;0;11”,“+02:00:00”};
tzdb.推回(tz);
tz.clear();
tz={“美国/凤凰城”、“MST”、“山地标准时间”、“山地标准时间”、“山地标准时间”、“山地标准时间”、“山地标准时间”、“-07:00:00”、“山地标准时间”、“+00:00:00”、“山地标准时间”、“+00:00:00”};
tzdb.推回(tz);
tz.clear();
m_tzdb=tzdb;
};
我想知道是否有人有任何想法来加快这一进程。同样,它们花费的时间很小,但是当你做了20万次以上的时候,它们就开始累积起来了。谢谢您的帮助。

您是否正在修改这些st