Վերադառնալ
Արդյունավետ C++ կոդ. ինչն է որոշում արագությունը
SiTech AI Team2 წთ. საკითხავი

Արդյունավետ C++ կոդ. ինչն է որոշում արագությունը

Ծրագրավորող Adam Sawicki-ն բացատրում է, թե ինչու C++ ընտրելը բավարար չէ արագ ծրագրի համար. արդյունքը որոշում են տվյալների դասավորությունը հիշողության մեջ, քեշի օգտագործումը և հատկացման ծախսը։ Հոդվածը լույս է տեսել Programista ամսագրում 2013 թվականին։

Միայն C++ ընտրելը ծրագիրը արագ չի դարձնում։ “Writing Efficient C++ Code” հոդվածում ծրագրավորող Adam Sawicki-ն բացատրում է, թե ինչն է որոշում, թե արդյոք կոդն իսկապես օգտագործում է սարքավորումը. ինչպես են տվյալները դասավորված հիշողության մեջ և ինչքան հաճախ է պրոցեսորը սպասում քեշին։ Հոդվածն առաջին անգամ լույս է տեսել Programista ամսագրում 2013 թվականին։

C++-ը ինքնին արագություն չի ապահովում

C++-ը բավական բարձր մակարդակի լեզու է օբյեկտային դիզայնի և պատրաստի կոնտեյներների համար, բայց և բավական ցածր մակարդակի, որ կոդի ու օպերացիոն համակարգի միջև չկան ոչ վիրտուալ մեքենա, ոչ աղբահավաք. հիշողությունը ազատում է ծրագրավորողը։

Տվյալների վրա հիմնված դիզայն

Data-Oriented Design մոտեցումը, որ տարածված է խաղ մշակողների շրջանում, սկսվում է տվյալներից. դրանց դասավորությունից հիշողության մեջ և դրանք պահող կառույցներից, իսկ ալգորիթմներն ընտրվում են ավելի ուշ։ Այն չի արգելում դասերը, բայց զգուշացնում է հիշողության մեջ ցրված ու ցուցիչներով կապված բազում փոքր օբյեկտների դեմ. նման դասավորությունը հաճախ քեշի բացթողում է առաջացնում և դժվարացնում զուգահեռացումը։ Սովորական զանգվածը, ընդհակառակը, մշակվում է տարր առ տարր, և դրա միջակայքը կարելի է բաժանել հոսքերի միջև։

Հիշողության հիերարխիան սահմանում է գինը

3 ԳՀց հաճախականության պրոցեսորի վրա մեկ թվաբանական գործողությունը տևում է մոտ 0,33 նանովայրկյան, այսինքն մեկ ցիկլ։ L1 քեշում արժեքը մոտ 1 նանովայրկյան է, L2-ում՝ մոտ 4,7, իսկ RAM-ում՝ շուրջ 83 նանովայրկյան կամ 250 ցիկլ։ Տվյալները տեղափոխվում են 64 բայթանոց քեշային տողերով, ուստի միասին օգտագործվող արժեքները պետք է կողք կողքի ընկնեն։

Գործողությունների արժեքի բուրգը՝ թվաբանությունից մինչև մուտք ու ելք

Դրա համար շարունակական կառույցները, օրինակ սովորական զանգվածը կամ std::vector-ը, գերազանցում են կապակցված ցուցակներին ու ծառերին։ Հոդվածը նկարագրում է “արտադրողականության բուրգը”. ամենաարագը թվաբանությունն է, ավելի դանդաղ են սինուսի կամ բաժանման նման տրանսցենդենտ գործողությունները, քեշի բացթողումից հետո RAM դիմելը հարյուրավոր ցիկլեր է, դինամիկ հատկացումը թանկ է, իսկ ամենադանդաղը մուտքն ու ելքն է։

AOS, SOA և կոմպիլյատորի սահմանները

Մասնիկների համակարգը լավ ցույց է տալիս այդ ընտրությունը։ Array of Structures-ը յուրաքանչյուր մասնիկի դիրքը, արագությունը և գույնը պահում է միասին, Structure of Arrays-ը՝ յուրաքանչյուր հատկության համար առանձին զանգված, այդպիսով մեկ ցիկլում անհրաժեշտ արժեքները մոտ են մնում, իսկ չօգտագործվող դաշտերը քեշ չեն մտնում։

Կոմպիլյատորը չի կարող ամեն ինչ ուղղել։ Երբ ցուցիչը կարող է ցույց տալ զանգվածի տարրերին, արժեքը ստիպված են վերընթերցել ամեն կրկնության ժամանակ, ինչին օգնում է տեղական փոփոխականում պատճենելը կամ __restrict-ը։ std::string-ը ցիկլից դուրս բերելը և ամեն անգամ մաքրելը թեստը 0,36 վայրկյանից դարձրեց 0,27, այսինքն 25%, քանի որ տողը պահում է հատկացված բուֆերը։

SSiTech

SiTech — AI-ով հզորացված վեբ մշակում

Ստեղծում ենք արագ ու ժամանակակից կայքեր և AI-ը ներդնում իրական բիզնես գործընթացներում։ Ունե՞ք նախագիծ կամ հարց։ Ուրախ կլինենք օգնել։