Giunsa namo paghubad ang 10 ka milyon nga linya sa C++ code ngadto sa C++14 standard (ug dayon ngadto sa C++17)

Pipila ka panahon ang milabay (sa tingdagdag sa 2016), sa panahon sa pagpalambo sa sunod nga bersyon sa 1C: Enterprise teknolohiya plataporma, ang pangutana mitungha sulod sa development team mahitungod sa pagsuporta sa bag-ong sumbanan. C ++ 14 sa atong code. Ang pagbalhin ngadto sa usa ka bag-ong sumbanan, ingon sa among gituohan, magtugot kanamo sa pagsulat sa daghang mga butang nga mas elegante, yano ug kasaligan, ug makapasayon ​​sa suporta ug pagmentinar sa code. Ug morag walay talagsaon sa paghubad, kon dili tungod sa sukdanan sa code base ug sa piho nga mga bahin sa atong code.

Alang niadtong wala mahibalo, ang 1C: Enterprise usa ka palibot alang sa paspas nga pag-uswag sa cross-platform nga mga aplikasyon sa negosyo ug runtime alang sa ilang pagpatuman sa lain-laing mga OS ug DBMS. Sa kinatibuk-an nga termino, ang produkto naglangkob:

Gisulayan namon nga isulat ang parehas nga code alang sa lainlaing mga operating system kutob sa mahimo - ang base sa code sa server 99% nga kasagaran, ang base sa code sa kliyente mga 95%. Ang 1C: Ang plataporma sa teknolohiya sa Enterprise kay gisulat sa C++ ug ang gibanabana nga mga kinaiya sa code gihatag sa ubos:

  • 10 milyon nga linya sa C++ code,
  • 14 ka libo nga mga file,
  • 60 ka libo nga mga klase,
  • tunga sa milyon nga mga pamaagi.

Ug kining tanang butang kinahanglang hubaron ngadto sa C++14. Karon isulti namon kanimo kung giunsa namon kini nahimo ug kung unsa ang among nasugatan sa proseso.

Giunsa namo paghubad ang 10 ka milyon nga linya sa C++ code ngadto sa C++14 standard (ug dayon ngadto sa C++17)

Disclaimer

Ang tanan nga nasulat sa ubos bahin sa hinay/paspas nga trabaho, (dili) dako nga konsumo sa panumduman pinaagi sa pagpatuman sa mga standard nga klase sa lain-laing mga librarya nagpasabot og usa ka butang: kini tinuod PARA KANATO. Posible nga ang mga sumbanan nga pagpatuman labing angay alang sa imong mga buluhaton. Nagsugod kami gikan sa among kaugalingon nga mga buluhaton: nagkuha kami mga datos nga kasagaran alang sa among mga kliyente, nagpadagan sa mga tipikal nga senaryo sa kanila, gitan-aw ang pasundayag, ang kantidad sa memorya nga nahurot, ug uban pa, ug gisusi kung kami ug ang among mga kliyente natagbaw sa ingon nga mga resulta o dili. . Ug sila milihok depende sa.

Ang naa namo

Sa sinugdan, gisulat namo ang code para sa 1C: Enterprise 8 nga plataporma sa Microsoft Visual Studio. Ang proyekto nagsugod sa sayong bahin sa 2000s ug kami adunay Windows-only nga bersyon. Natural, sukad niadto ang code aktibo nga naugmad, daghang mga mekanismo ang hingpit nga gisulat pag-usab. Apan ang code gisulat sumala sa 1998 nga sumbanan, ug, pananglitan, ang atong tuo nga anggulo nga bracket gibulag sa mga luna aron ang paghugpong molampos, sama niini:

vector<vector<int> > IntV;

Sa 2006, uban sa pagpagawas sa plataporma nga bersyon 8.1, nagsugod kami sa pagsuporta sa Linux ug mibalhin ngadto sa usa ka ikatulo nga partido nga standard library STLPort. Usa sa mga hinungdan sa transisyon mao ang pagtrabaho sa lapad nga linya. Sa among code, gigamit namo ang std::wstring, nga gibase sa wchar_t type, sa tibuok. Ang gidak-on niini sa Windows kay 2 bytes, ug sa Linux ang default kay 4 bytes. Kini misangpot sa dili pagkaangay sa among binary nga mga protocol tali sa kliyente ug server, ingon man sa nagkalain-laing padayon nga datos. Gamit ang mga kapilian sa gcc, mahimo nimong mahibal-an nga ang gidak-on sa wchar_t sa panahon sa pag-compile mao usab ang 2 bytes, apan mahimo nimong kalimtan ang bahin sa paggamit sa standard nga librarya gikan sa compiler, tungod kay kini naggamit glibc, nga sa baylo gihugpong alang sa usa ka 4-byte wchar_t. Ang ubang mga rason mao ang mas maayo nga pagpatuman sa mga standard nga mga klase, suporta alang sa hash tables, ug bisan ang pagsundog sa mga semantika sa pagbalhin sulod sa mga sudlanan, nga aktibo namong gigamit. Ug usa pa ka rason, ingon sa ilang giingon nga katapusan apan dili labing gamay, mao ang pasundayag sa string. Kami adunay kaugalingon nga klase alang sa mga kuwerdas, tungod kay... Tungod sa mga detalye sa among software, ang mga operasyon sa string kaylap kaayo nga gigamit ug alang kanamo kini kritikal.

Ang among string gibase sa mga ideya sa pag-optimize sa string nga gipahayag balik sa sayong bahin sa 2000s Andrei Alexandrescu. Sa ulahi, sa dihang nagtrabaho si Alexandrescu sa Facebook, sa iyang sugyot, usa ka linya ang gigamit sa makina sa Facebook nga nagtrabaho sa susamang mga prinsipyo (tan-awa ang librarya kabuang).

Gigamit sa among linya ang duha ka panguna nga teknolohiya sa pag-optimize:

  1. Alang sa mugbo nga mga kantidad, usa ka internal nga buffer sa string nga butang mismo ang gigamit (wala magkinahanglan dugang nga alokasyon sa memorya).
  2. Alang sa uban pa, gigamit ang mga mekaniko Kopyaha Sa Pagsulat. Ang string value gitipigan sa usa ka dapit, ug usa ka reference counter ang gigamit sa panahon sa assignment/modification.

Aron mapadali ang paghugpong sa plataporma, wala namo iapil ang pagpatuman sa sapa gikan sa among variant sa STLPort (nga wala namo gamita), naghatag kini kanamo ug mga 20% nga mas paspas nga paghugpong. Pagkahuman kinahanglan namon nga gamiton ang limitado nga paggamit magtulud, magduso. Gigamit sa Boost ang stream, labi na sa mga API sa serbisyo niini (pananglitan, para sa pag-log), busa kinahanglan namon nga usbon kini aron matangtang ang paggamit sa sapa. Kini, sa baylo, nagpalisud kanamo sa pagbalhin sa bag-ong mga bersyon sa Boost.

Ikatulo nga paagi

Kung mobalhin sa C ++ 14 nga sumbanan, among gikonsiderar ang mosunod nga mga kapilian:

  1. I-upgrade ang STLPort nga among giusab sa C++14 standard. Ang kapilian lisud kaayo, tungod kay ... Ang suporta alang sa STLPort gihunong sa 2010, ug kinahanglan namon nga buhaton ang tanan nga code niini sa among kaugalingon.
  2. Pagbalhin ngadto sa lain nga pagpatuman sa STL nga compatible sa C++14. Gitinguha kaayo nga kini nga pagpatuman alang sa Windows ug Linux.
  3. Kung mag-compile para sa matag OS, gamita ang library nga gitukod sa katugbang nga compiler.

Ang una nga kapilian gisalikway nga direkta tungod sa sobra nga trabaho.

Naghunahuna kami mahitungod sa ikaduha nga kapilian sulod sa pipila ka panahon; giisip nga kandidato libc++, apan niadtong panahona wala kini molihok ubos sa Windows. Aron ma-port ang libc ++ sa Windows, kinahanglan nimo nga buhaton ang daghang trabaho - pananglitan, isulat ang tanan nga adunay kalabotan sa mga hilo, pag-synchronize sa thread ug atomicity, tungod kay gigamit ang libc++ sa kini nga mga lugar. POSIX API.

Ug gipili namo ang ikatulo nga paagi.

Transisyon

Mao nga, kinahanglan namon nga ilisan ang paggamit sa STLPort sa mga librarya sa katugbang nga mga compiler (Visual Studio 2015 alang sa Windows, gcc 7 alang sa Linux, clang 8 alang sa macOS).

Maayo na lang, ang among code gisulat nag-una sumala sa mga giya ug wala mogamit sa tanan nga mga matang sa maalamon nga mga limbong, mao nga ang paglalin ngadto sa bag-ong mga librarya nagpadayon nga medyo hapsay, uban sa tabang sa mga script nga mipuli sa mga ngalan sa mga tipo, klase, namespaces ug naglakip sa tinubdan mga file. Ang paglalin nakaapekto sa 10 ka source files (gikan sa 000). wchar_t gipulihan sa char14_t; nakahukom kami nga biyaan ang paggamit sa wchar_t, tungod kay Ang char000_t nagkinahanglan og 16 bytes sa tanang OS ug dili makadaut sa code compatibility tali sa Windows ug Linux.

Adunay pipila ka gagmay nga mga panimpalad. Pananglitan, sa STLPort ang usa ka iterator mahimong ihulog sa usa ka pointer sa usa ka elemento, ug sa pipila ka mga lugar sa among code kini gigamit. Sa bag-ong mga librarya dili na posible nga buhaton kini, ug kini nga mga tudling kinahanglan nga analisahon ug isulat pag-usab nga mano-mano.

Busa, ang code migration kompleto, ang code gihugpong para sa tanang operating system. Panahon na alang sa mga pagsulay.

Ang mga pagsulay human sa transisyon nagpakita sa usa ka drop sa performance (sa pipila ka mga dapit ngadto sa 20-30%) ug usa ka pagtaas sa konsumo sa panumduman (hangtod sa 10-15%) kon itandi sa daan nga bersyon sa code. Kini, ilabi na, tungod sa suboptimal nga performance sa standard strings. Busa, kinahanglan na usab namon nga gamiton ang among kaugalingon, gamay nga giusab nga linya.

Usa ka makaiikag nga bahin sa pagpatuman sa mga sudlanan sa mga naka-embed nga librarya gipadayag usab: walay sulod (walay elemento) std::map ug std::set gikan sa built-in nga mga librarya naggahin ug memorya. Ug tungod sa mga bahin sa pagpatuman, sa pipila ka mga lugar sa code daghang mga walay sulod nga mga sudlanan sa kini nga tipo ang gihimo. Ang mga standard nga mga sudlanan sa panumduman gigahin gamay, alang sa usa ka elemento sa ugat, apan alang kanamo kini nahimo nga kritikal - sa daghang mga senaryo, ang among pasundayag mikunhod pag-ayo ug ang pagkonsumo sa panumduman nagdugang (itandi sa STLPort). Busa, sa among code gipulihan namo kining duha ka matang sa mga sudlanan gikan sa mga built-in nga librarya sa ilang pagpatuman gikan sa Boost, diin kini nga mga sudlanan wala niini nga bahin, ug kini nakasulbad sa problema sa paghinay ug pagdugang sa konsumo sa memorya.

Sama sa kanunay nga mahitabo pagkahuman sa dagkong mga pagbag-o sa dagkong mga proyekto, ang una nga pag-uli sa source code wala molihok nga wala’y mga problema, ug dinhi, labi na, ang suporta alang sa pag-debug sa mga iterator sa pagpatuman sa Windows magamit. Sa hinay-hinay mipadayon kami sa unahan, ug sa tingpamulak sa 2017 (bersyon 8.3.11 1C:Enterprise) ang paglalin nahuman.

Mga resulta

Ang transisyon ngadto sa C++14 nga sumbanan mikuha kanamo ug mga 6 ka bulan. Kadaghanan sa panahon, usa (apan labi ka kwalipikado) nga developer ang nagtrabaho sa proyekto, ug sa katapusan nga yugto ang mga representante sa mga koponan nga responsable sa piho nga mga lugar nga giapil - UI, cluster sa server, mga gamit sa pag-uswag ug pagdumala, ug uban pa.

Gipasimple kaayo sa transisyon ang among trabaho sa paglalin ngadto sa pinakabag-o nga bersyon sa sumbanan. Sa ingon, ang bersyon 1C: Enterprise 8.3.14 (sa pag-uswag, gi-iskedyul nga pagpagawas sa sayo sa sunod tuig) gibalhin na sa sumbanan C++ 17.

Pagkahuman sa paglalin, ang mga developer adunay daghang kapilian. Kung kaniadto kami adunay kaugalingon nga giusab nga bersyon sa STL ug usa ka std namespace, karon kami adunay mga standard nga klase gikan sa built-in nga mga librarya sa compiler sa std namespace, sa stdx namespace - ang among mga linya ug sudlanan nga na-optimize alang sa among mga buluhaton, sa pagdugang - ang pinakabag-o nga bersyon sa boost. Ug gigamit sa developer ang mga klase nga labing angay aron masulbad ang iyang mga problema.

Ang "native" nga pagpatuman sa mga move constructor makatabang usab sa kalamboan (paglihok sa mga konstruktor) alang sa daghang mga klase. Kung ang usa ka klase adunay usa ka tigtukod sa paglihok ug kini nga klase gibutang sa usa ka sudlanan, nan ang STL nag-optimize sa pagkopya sa mga elemento sa sulod sa sudlanan (pananglitan, kung ang sudlanan gipalapdan ug kinahanglan nga usbon ang kapasidad ug i-relocate ang memorya).

Usa ka kutsara sa alkitran

Tingali ang labing dili maayo (apan dili kritikal) nga sangputanan sa paglalin mao nga kita nag-atubang sa pagtaas sa gidaghanon obj nga mga file, ug ang bug-os nga resulta sa pagtukod uban sa tanan nga intermediate nga mga file nagsugod sa pagkuha sa 60-70 GB. Kini nga kinaiya tungod sa mga peculiarities sa modernong standard nga mga librarya, nga nahimong dili kaayo kritikal sa gidak-on sa namugna nga mga file sa serbisyo. Dili kini makaapekto sa operasyon sa gihugpong nga aplikasyon, apan kini hinungdan sa daghang mga kahasol sa pag-uswag, ilabi na, kini nagdugang sa oras sa pag-compile. Ang mga kinahanglanon alang sa libre nga wanang sa disk sa mga server sa pagtukod ug sa mga makina sa developer nagkadaghan usab. Ang among mga developers nagtrabaho sa daghang mga bersyon sa plataporma nga managsama, ug gatusan ka gigabytes sa intermediate nga mga file usahay makahimo og mga kalisdanan sa ilang trabaho. Ang problema dili maayo, apan dili kritikal; gi-postpone namo ang solusyon niini sa pagkakaron. Among gikonsiderar ang teknolohiya isip usa sa mga opsyon sa pagsulbad niini pagtukod sa panaghiusa (sa partikular, gigamit kini sa Google sa dihang nag-develop sa Chrome browser).

Source: www.habr.com

Idugang sa usa ka comment