代码之家  ›  专栏  ›  技术社区  ›  Clark Gaebel

“变量跟踪”正在吞噬我的编译时间!

  •  7
  • Clark Gaebel  · 技术社区  · 16 年前

    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...
        }
    }
    

    当我像这样构建它时,构建时间是巨大的。如果我使用脚本将所有函数自动内联到它们各自的案例中,构建时间将减少一半。GCC4.5.0说,当我使用-ftime报告时,“变量跟踪”占用了大约50%的构建时间。这意味着什么?如何在保持从交换机中拉出函数的优越缓存位置的同时加快编译速度?

    :有趣的是,根据整个项目的以下分析信息(这不仅是有问题的文件,而且还是一个很好的度量标准),构建时间只在调试构建时爆炸;有问题的文件花费的时间最多):

    • 调试:8分50秒
    • 释放:4分25秒

    如果你好奇的话,这里有几个例子,删除了上下文。如您所见,我简化了问题定义,只显示了相关部分。如果你想知道,所有的自我->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, &paramPtr, length);
        std::string p1 = extract_string(parameters, &paramPtr, length);
        int32_t p2 = extract_int32(parameters, &paramPtr, length);
        uint32_t p3 = extract_uint32(parameters, &paramPtr, length);
        tuple<Buffer, size_t, size_t> p4 = extract_blob(parameters, &paramPtr, 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, &paramPtr, length);
        std::string p1 = extract_string(parameters, &paramPtr, length);
        array<uint16_t, 3> p2 = extract_vector(parameters, &paramPtr, length);
        std::string p3 = extract_string(parameters, &paramPtr, length);
        uint8_t p4 = extract_uint8(parameters, &paramPtr, length);
        uint8_t p5 = extract_uint8(parameters, &paramPtr, length);
        uint64_t p6 = extract_MUID(parameters, &paramPtr, length);
        bool p7 = extract_bool(parameters, &paramPtr, length);
        tuple<Buffer, size_t, size_t> p8 = extract_blob(parameters, &paramPtr, length);
    
        return self->Match_ResponseLogin(p0, p1, p2, p3, p4, p5, p6, p7, p8);
    }
    
    2 回复  |  直到 16 年前
        1
  •  12
  •   Dean Harding    16 年前

    可以关闭变量跟踪。变量跟踪用于使调试信息更有价值,但是如果此代码是自动生成的,并且您实际上不打算对其进行大量调试,那么它就没有真正的用处。你可以把它关掉 仅用于该文件 .

    gcc -fno-var-tracking ...
    

    应该会成功的。就像我说的,我想你可以为那个文件做。

        2
  •  2
  •   NerdMachine    11 年前

    在gnumake中,如果compile命令在参数中使用flags变量,则可以关闭单个目标的变量跟踪,如

    fileName.o: CXXFLAGS += -fno-var-tracking
    
    推荐文章