【发布时间】:2019-11-18 05:34:11
【问题描述】:
我正在使用 gcc 4.8.5 编译 c++98 代码。我的 C++ 代码静态初始化 unoredred_maps 的 unordered_map,总共有约 20,000 个键值对,以及将采用约 450 种不同类型的重载函数。这个程序会在一个连续的数据流上执行,对于每一个数据块,重载的函数都会返回一个输出。
问题是,gcc 由于初始化了大约 20,000 个键值对,编译时间过长。
嵌套的 unordered_map 的结构为map< DATATYPE, map< key, value >>,每个数据输入只调用一个重载函数。换句话说,我不需要静态初始化整个嵌套映射,而是可以在需要时为相应的数据类型动态定义map<key, value>。例如,我可以检查地图的定义,当它未定义时,我可以稍后在运行时填充它。这将产生一个平均约 45 个键值对的映射。
但是,我知道动态初始化需要更长的代码。对于上面描述的简单执行(静态初始化整个地图),动态初始化等其他方法会显着减少时间吗?我的理解是,无论我采取什么替代方案,我仍然需要编写代码来填充整个键值对。此外,在大多数情况下,填充 unordered_map (hashmap) 的开销和实际计算不应出现渐近差异,并且与运行相同数量的循环以增加值相比,不应显示出显着差异。
作为参考,我正在编写一个 python 脚本,它读取多个 json 文件以打印出 c++ 代码,然后使用 gcc 进行编译。我不是直接从 c++ 读取 json,所以无论我做什么,c++ 源代码都需要一一插入键值,因为它无法访问 json 文件。
// below is someEXE.cpp, which is a result from python script.
// Every line is inside python's print"" (using python 2.7)
// so that it can write complete c++ that should compile.
someEXE.cpp
// example of an overloaded function among ~450
// takes in pointer to data and exampleMap created above
void exampleFunction(DIFFERENT_TYPE1*data,
std::unorderd_map<std::string, std::unordered_map<std::string, std::string>> exampleMap) {
printf("this is in specific format: %s", exampleMap["DATATYPE1"]
[std::to_string(data->member_variable)].c_str();
//... more print functions below (~25 per datatype)
};
int main() {
// current definition of the unordered_map (total ~20,000 pairs)
std::unordered_map<std::string, std::unordered_map<std::string,
std::string>> exampleMap = {
{"DATATYPE1", {{"KEY1", "VAL1"}, {"KEY2", "VAL2"}, /*...*/}}
};
// create below test function for all ~450 types
// when I run the program, code will printf values to screen
DIFFERENT_TYPE1 testObj = {0};
DIFFERENT_TYPE1 *testObjPointer = &testObj;
exampleFunction(testObjPointer, exampleMap);
return 0;
}
编辑:我最初的问题是“CMAKE 编译时间是否与...成正比”。在 cmets 的帮助下,用实际的编译器名称 gcc 4.8.5 更改了术语“CMAKE”。
【问题讨论】:
-
CMake 不是编译器,因此 CMake 不会编译代码。
-
不,没有一般规律,规定 编译时间 = 5 秒 * 代码行数 左右。这取决于很多事情。
-
这篇文章背后有一个很好的问题,即如何提高特定数据结构的编译时间。但也有一些非常令人分心的误解隐藏了这个好问题。你能edit你的帖子并用你的实际编译器(即g++、clang++、msvc等)替换CMake吗?
-
@alterigel 和 nada,我编辑了帖子,谢谢
标签: c++ gcc compilation hashmap compile-time