2016-05-19 9 views
7

मैं सीएमके सक्षम सी ++ परियोजनाओं के हाल ही में समय (जैसे "At what level should I distribute my build process?" या "cmake rebuild_cache for just a subdirectory?") के बारी-बारी के समय में सुधार के विशिष्ट पहलुओं के बारे में कई एसओ प्रश्नों में आया, मैं सोच रहा था कि सीएमके की विशिष्ट संभावनाओं का उपयोग करने के लिए अधिक सामान्य मार्गदर्शन है या नहीं। यदि संभवतः कोई क्रॉस-प्लेटफ़ॉर्म संकलन समय अनुकूलन नहीं है, तो मुझे मुख्य रूप से विजुअल स्टूडियो या जीएनयू अतिचेक आधारित दृष्टिकोण में रूचि है।मेरे सीएमके सक्षम सी ++ प्रोजेक्ट का संकलन समय कैसे बढ़ाएं?

और मैं पहले से ही के बारे में पता है और आम तौर पर की सिफारिश की क्षेत्रों में निवेश सी ++ तेजी लाने के लिए कर रहा हूँ बनाता है:

  1. बदलें/अनुकूलन/फ़ाइन-ट्यून toolchain

  2. अपने कोड बेस का अनुकूलन/सॉफ्टवेयर वास्तुकला (निर्भरता को कम करके जैसे और प्रयोग अच्छी तरह से परिभाषित उप-परियोजनाओं - इकाई परीक्षण)

  3. एक बेहतर हार्डवेयर में निवेश (एसएसडी, सीपीयू, स्मृति)

  4. +०१२३५१६४१०६

अनुशंसित here, here या here की तरह। तो इस सवाल में मेरा ध्यान पहली बात पर है।

प्लस मैं सिफारिशों के बारे में पता CMake के विकी में पाया जा सकता:

पूर्व सिर्फ ज्यादातर कैसे मूल बातें (समानांतर मेक), बाद में हैंडल हैंडल सीएमके फाइलों को पार्सिंग करने के लिए।

बस इस एक छोटे से अधिक ठोस बनाने के लिए, अगर मैं अपने CMake उदाहरण MSYS/जीएनयू का उपयोग कर here 100 के साथ पुस्तकालयों से मैं निम्नलिखित time माप परिणाम मिला ले:

$ cmake --version 
cmake version 3.5.2 
CMake suite maintained and supported by Kitware (kitware.com/cmake). 

$ time -p cmake -G "MSYS Makefiles" .. 
-- The CXX compiler identification is GNU 4.8.1 
... 
-- Configuring done 
-- Generating done 
-- Build files have been written to: [...] 
real 27.03 
user 0.01 
sys 0.03   

$ time -p make -j8 
... 
[100%] Built target CMakeTest 
real 113.11 
user 8.82 
sys 33.08 

तो मैं की कुल राशि ~ 140 सेकंड और मेरा लक्ष्य - इस स्वीकार्य रूप से बहुत ही सरल उदाहरण के लिए - इसे मानक सेटिंग्स/टूल के साथ प्राप्त होने वाले लगभग 10-20% तक पहुंचाना होगा।

उत्तर

7

यहाँ मैं CMake और विजुअल स्टूडियो या जीएनयू toolchains का उपयोग कर अच्छे परिणाम मिले थे बताया गया है:

  1. एक्सचेंज जीएनयू Ninja साथ बनाते हैं। यह तेज़ है, सभी उपलब्ध CPU कोरों का स्वचालित रूप से उपयोग करता है और इसका एक अच्छा निर्भरता प्रबंधन है। बस

    ए से अवगत रहें।) आपको सीएमके में लक्ष्य निर्भरता को सही ढंग से सेट करने की आवश्यकता है। यदि आप किसी ऐसे बिंदु पर पहुंचते हैं जहां निर्माण के किसी अन्य आर्टिफैक्ट की निर्भरता है, तो इसे तब तक इंतजार करना होगा जब तक संकलित नहीं किया जाता है (सिंक्रनाइज़ेशन पॉइंट)।

    $ time -p cmake -G "Ninja" .. 
    -- The CXX compiler identification is GNU 4.8.1 
    ... 
    real 11.06 
    user 0.00 
    sys 0.00 
    
    $ time -p ninja 
    ... 
    [202/202] Linking CXX executable CMakeTest.exe 
    real 40.31 
    user 0.01 
    sys 0.01 
    

    बी।) लिंकिंग हमेशा एक सिंक्रनाइज़ेशन बिंदु है। तो आप उनको कम करने के लिए सीएमके के Object Libraries का अधिक उपयोग कर सकते हैं, लेकिन यह आपके सीएमके कोड को थोड़ा सा बना देता है।

    $ time -p ninja 
    ... 
    [102/102] Linking CXX executable CMakeTest.exe 
    real 27.62 
    user 0.00 
    sys 0.04 
    
  2. स्प्लिट कम बार बदल गया है या अलग CMake परियोजनाओं में स्थिर कोड भागों और का उपयोग CMake के ExternalProject_Add() या - अगर आप जैसे कुछ पुस्तकालयों की बाइनरी डिलीवरी पर स्विच करें - find_library()

  3. अपने दैनिक काम के लिए कंपाइलर/लिंकर विकल्पों के एक अलग सेट के बारे में सोचें (लेकिन केवल तभी यदि आपके पास अंतिम रिलीज बिल्ड विकल्पों के साथ कुछ परीक्षण समय/अनुभव भी है)।

    एक।) जाएं अनुकूलन भागों

    ख।) वृद्धिशील जोड़ने

  4. आप अक्सर CMake कोड में ही परिवर्तन करते हैं की कोशिश करो, अपने मशीन की वास्तुकला के लिए अनुकूलित स्रोतों से CMake के पुनर्निर्माण के बारे में सोचते हैं। सीएमके की आधिकारिक रूप से वितरित बाइनरी हर संभावित सीपीयू आर्किटेक्चर पर काम करने के लिए सिर्फ एक समझौता है।

    जब मैं सीएमके 3.5.2 के पुनर्निर्माण के लिए MinGW64/MSYS का उपयोग करता हूं उदा।

    cmake -DCMAKE_BUILD_TYPE:STRING="Release" 
         -DCMAKE_CXX_FLAGS:STRING="-march=native -m64 -Ofast -flto" 
         -DCMAKE_EXE_LINKER_FLAGS:STRING="-Wl,--allow-multiple-definition" 
         -G "MSYS Makefiles" .. 
    

    मैं पहले भाग में तेजी लाने के कर सकते हैं:

    $ time -p [...]/MSYS64/bin/cmake.exe -G "Ninja" .. 
    real 6.46 
    user 0.03 
    sys 0.01 
    
  5. मैं अपनी फ़ाइल/ओ बहुत धीमी है और जब से CMake समर्पित द्विआधारी उत्पादन निर्देशिका के साथ काम करता है, रैम डिस्क का उपयोग करना है। यदि आप अभी भी हार्ड ड्राइव का उपयोग करते हैं, तो ठोस स्थिति डिस्क पर स्विच करने पर विचार करें।

  6. अपनी अंतिम आउटपुट फ़ाइल के आधार पर, Gold Linker के साथ जीएनयू मानक लिंकर का आदान-प्रदान करें। गोल्ड लिंकर से भी तेज एलएलवीएम परियोजना से एलएलडी है। आपको यह जांचना होगा कि क्या यह आपके मंच पर पहले से ही आवश्यक सुविधाओं का समर्थन करता है या नहीं।

  7. विज़ुअल सी ++ कंपाइलर के बजाय Clang/c2 का उपयोग करें। विज़ुअल सी ++ कंपाइलर प्रदर्शन अनुशंसाओं के लिए दृश्य सी ++ टीम से प्रदान की जाती है, https://blogs.msdn.microsoft.com/vcblog/2016/10/26/recommendations-to-speed-c-builds-in-visual-studio/

  8. Increadibuild संकलन समय को बढ़ावा दे सकता है।

संदर्भ

+0

इसके अलावा, उपयोग ccache। यह बहुत तेजी से recompilations बनाता है। – csl

+0

यदि आपका निर्माण प्रणाली ठीक से बढ़ती पुनर्निर्माण कर रही है, तो सीसीएसी मदद के लिए बहुत कम होना चाहिए। अच्छी तरह से लिखे गए सेमेक बिल्ड पर जो वृद्धिशील बनाता है सही बनाता है, सीसीएसी वास्तव में आपको इसके ऊपरी हिस्से से नीचे धीमा कर देता है। मैंने अतीत में परियोजनाओं पर सीसीएसी के साथ सफलता हासिल की है जो चूसने वाली बिल्डिंग प्रणालियों के साथ सफलतापूर्वक संकलन नहीं करती है, हालांकि (फ़ायरफ़ॉक्स, साल पहले) –

संबंधित मुद्दे