我有一个自动生成的文件,看起来像这样......
static void do_SomeFunc1(void* parameter)
{
// Do stuff.
}
// Continues on for another 4000 functions...
void dispatch(int id, void* parameter)
{
switch(id)
{
case ::SomeClass1::id: return do_SomeFunc1(parameter);
case ::SomeClass2::id: return do_SomeFunc2(parameter);
// This continues for the next 4000 cases...
}
}
当我像这样构建它时,构建时间是巨大的。如果我使用我的脚本将所有函数自动内联到它们各自的案例中,构建时间就会减少一半。GCC 4.5.0 说,当我使用 -ftime-report 时,“变量跟踪”占用了大约 50% 的构建时间。这是什么意思?我怎样才能加快编译速度,同时仍然保持从交换机中提取功能的卓越缓存局部性?
编辑:有趣的是,构建时间仅在调试构建时爆炸,根据整个项目的以下分析信息(这不仅仅是有问题的文件,但仍然是一个很好的指标;有问题的文件花费的时间最多建立):
- 调试:8 分 50 秒
- 释放:4分25秒
如果你很好奇,这里有一些示例 do_func,上下文已删除。如您所见,我稍微简化了问题定义,只显示相关部分。如果您想知道,所有 self->func 调用都是对 boost::signal 的调用。
static void do_Match_Login(Registry* self, const uint8_t* parameters, uint16_t length)
{
const uint8_t* paramPtr = parameters;
std::string p0 = extract_string(parameters, ¶mPtr, length);
std::string p1 = extract_string(parameters, ¶mPtr, length);
int32_t p2 = extract_int32(parameters, ¶mPtr, length);
uint32_t p3 = extract_uint32(parameters, ¶mPtr, length);
tuple<Buffer, size_t, size_t> p4 = extract_blob(parameters, ¶mPtr, length);
return self->Match_Login(p0, p1, p2, p3, p4);
}
static void do_Match_ResponseLogin(Registry* self, const uint8_t* parameters, uint16_t length)
{
const uint8_t* paramPtr = parameters;
int32_t p0 = extract_int32(parameters, ¶mPtr, length);
std::string p1 = extract_string(parameters, ¶mPtr, length);
array<uint16_t, 3> p2 = extract_vector(parameters, ¶mPtr, length);
std::string p3 = extract_string(parameters, ¶mPtr, length);
uint8_t p4 = extract_uint8(parameters, ¶mPtr, length);
uint8_t p5 = extract_uint8(parameters, ¶mPtr, length);
uint64_t p6 = extract_MUID(parameters, ¶mPtr, length);
bool p7 = extract_bool(parameters, ¶mPtr, length);
tuple<Buffer, size_t, size_t> p8 = extract_blob(parameters, ¶mPtr, length);
return self->Match_ResponseLogin(p0, p1, p2, p3, p4, p5, p6, p7, p8);
}