Pehea mākou i unuhi ai i 10 miliona mau laina o ka code C++ i ka maʻamau C++14 (a laila iā C++17)

I kekahi manawa i hala aku nei (i ka hāʻule o 2016), i ka wā o ka hoʻomohala ʻana i ka mana hou o ka 1C: Enterprise technology platform, ua kū mai ka nīnau i loko o ka hui hoʻomohala e pili ana i ke kākoʻo ʻana i ka maʻamau hou. C ++ 14 i kā mākou code. ʻO ka hoʻololi ʻana i kahi maʻamau hou, e like me kā mākou i manaʻo ai, e ʻae iā mākou e kākau i nā mea he nui me ka nani, maʻalahi a hilinaʻi hoʻi, a e maʻalahi i ke kākoʻo a me ka mālama ʻana i ke code. A ʻaʻohe mea kupanaha i ka unuhi ʻana, inā ʻaʻole no ka nui o ke kumu code a me nā hiʻohiʻona kikoʻī o kā mākou code.

No ka poʻe ʻike ʻole, ʻo 1C: ʻO Enterprise kahi ʻāina no ka hoʻomohala wikiwiki ʻana i nā noi ʻoihana cross-platform a me ka manawa holo no kā lākou hoʻokō ʻana ma nā OS a me nā DBMS like ʻole. Ma nā ʻōlelo maʻamau, aia ka huahana:

Ke ho'āʻo nei mākou e kākau i ka code like no nā ʻōnaehana hana like ʻole e like me ka hiki - ʻo ka waihona code server he 99% maʻamau, ʻo ka waihona code client ma kahi o 95%. Ua kākau mua ʻia ka paepae ʻenehana 1C: Enterprise ma C++ a ua hāʻawi ʻia nā ʻano code code ma lalo nei:

  • 10 miliona mau laina o ka code C++,
  • 14 tausani faila,
  • 60 tausani papa,
  • he hapalua miliona mau ala.

A pono e unuhi ʻia kēia mau mea a pau i C++14. I kēia lā e haʻi mākou iā ʻoe pehea mākou i hana ai i kēia a me nā mea a mākou i hālāwai ai ma ke kaʻina hana.

Pehea mākou i unuhi ai i 10 miliona mau laina o ka code C++ i ka maʻamau C++14 (a laila iā C++17)

Hoʻolele

ʻO nā mea a pau i kākau ʻia ma lalo nei e pili ana i ka hana lohi/wikiwiki, (ʻaʻole) ka hoʻohana ʻana i ka hoʻomanaʻo nui ma o ka hoʻokō ʻana i nā papa maʻamau i loko o nā hale waihona puke ʻokoʻa, hoʻokahi mea: ʻoiaʻiʻo kēia no mākou. Hiki paha ke kūpono nā hoʻokō maʻamau no kāu mau hana. Hoʻomaka mākou mai kā mākou mau hana ponoʻī: lawe mākou i ka ʻikepili maʻamau no kā mākou mea kūʻai aku, holo i nā hiʻohiʻona maʻamau ma luna o lākou, nānā i ka hana, ka nui o ka hoʻomanaʻo i hoʻopau ʻia, etc. . A hana lākou ma muli o.

ʻO ka mea i loaʻa iā mākou

I ka hoʻomaka, kākau mākou i ke code no ka 1C: Enterprise 8 platform ma Microsoft Visual Studio. Ua hoʻomaka ka papahana i nā makahiki 2000 mua a loaʻa iā mākou kahi mana Windows wale nō. ʻO ka mea maʻamau, mai ia manawa ua hoʻomohala ikaika ʻia ke code, ua kākau hou ʻia nā hana he nui. Akā ua kākau ʻia ke code e like me ka maʻamau 1998, a, no ka laʻana, ua hoʻokaʻawale ʻia kā mākou mau kihi ʻākau e nā hakahaka i mea e kūleʻa ai ka hui ʻana, e like me kēia:

vector<vector<int> > IntV;

I ka makahiki 2006, me ka hoʻokuʻu ʻia ʻana o ka mana o ka platform 8.1, ua hoʻomaka mākou e kākoʻo iā Linux a ua hoʻololi i kahi waihona maʻamau ʻaoʻao ʻekolu. STLPort. ʻO kekahi kumu o ka hoʻololi ʻana ʻo ia ka hana me nā laina ākea. Ma kā mākou code, hoʻohana mākou i ka std::wstring, i hoʻokumu ʻia ma ke ʻano wchar_t, a puni. ʻO kona nui ma Windows he 2 bytes, a ma Linux ka paʻamau he 4 bytes. Ua alakaʻi kēia i ka like ʻole o kā mākou mau protocol binary ma waena o ka mea kūʻai aku a me ka server, a me nā ʻikepili hoʻomau like ʻole. Ke hoʻohana nei i nā koho gcc, hiki iā ʻoe ke kuhikuhi i ka nui o ka wchar_t i ka wā o ka hui ʻana he 2 bytes, akā hiki iā ʻoe ke poina e pili ana i ka hoʻohana ʻana i ka waihona maʻamau mai ka compiler, no ka mea hoʻohana ʻo ia i ka glibc, ka mea i hōʻuluʻulu ʻia no kahi 4-byte wchar_t. ʻO nā kumu ʻē aʻe ʻoi aku ka maikaʻi o ka hoʻokō ʻana i nā papa maʻamau, kākoʻo i nā papa hash, a me ka hoʻohālikelike ʻana i nā semantics o ka neʻe ʻana i loko o nā ipu, a mākou i hoʻohana ikaika ai. A ʻo kekahi kumu hou aʻe, e like me kā lākou e ʻōlelo nei, ʻo ka hana string. Loaʻa iā mākou kā mākou papa ponoʻī no ke kaula, no ka mea... Ma muli o nā kikoʻī o kā mākou polokalamu, hoʻohana nui ʻia nā hana string a no mākou he mea koʻikoʻi kēia.

Hoʻokumu ʻia kā mākou kaula i nā manaʻo loiloi string i hōʻike ʻia i nā makahiki 2000 mua Andrei Alexandrescu. Ma hope mai, i ka wā i hana ai ʻo Alexandrescu ma Facebook, ma kāna manaʻo, ua hoʻohana ʻia kahi laina ma ka ʻenekini Facebook e hana ana ma nā loina like (e nānā i ka hale waihona puke. lapuwale).

Ua hoʻohana kā mākou laina i ʻelua mau ʻenehana loiloi nui:

  1. No nā waiwai pōkole, hoʻohana ʻia kahi pale kūloko i loko o ka mea string ponoʻī (ʻaʻole koi i ka hoʻokaʻawale hoʻomanaʻo hou).
  2. No nā mea ʻē aʻe, hoʻohana ʻia nā mīkini Kope Ma Kākau. Mālama ʻia ka waiwai string ma kahi hoʻokahi, a hoʻohana ʻia kahi helu kuhikuhi i ka wā o ka hoʻonohonoho ʻana/hoʻololi.

I mea e wikiwiki ai ka hoʻopili ʻana i ka paepae, ua kāpae mākou i ka hoʻokō kahawai mai kā mākou ʻano ʻano STLPort (ʻaʻole mākou i hoʻohana), hāʻawi kēia iā mākou ma kahi o 20% ʻoi aku ka wikiwiki. A laila pono mākou e hoʻohana i ka hoʻohana palena ʻole Boost. Hoʻohana koʻikoʻi ʻo Boost i ke kahawai, ʻo ia hoʻi i kāna lawelawe API (no ka laʻana, no ka hoʻopaʻa inoa ʻana), no laila pono mākou e hoʻololi iā ia e wehe i ka hoʻohana ʻana i ke kahawai. ʻO kēia, ua paʻakikī iā mākou ke neʻe i nā mana hou o Boost.

ʻEkolu ala

I ka neʻe ʻana i ka maʻamau C++14, ua noʻonoʻo mākou i kēia mau koho:

  1. Hoʻonui i ka STLPort a mākou i hoʻololi ai i ka maʻamau C++14. He paʻakikī loa ka koho, no ka mea ... Ua hoʻopau ʻia ke kākoʻo no STLPort i ka makahiki 2010, a pono mākou e kūkulu i kāna code a pau iā mākou iho.
  2. Hoʻololi i kahi hoʻokō STL ʻē aʻe i kūpono me C++14. He mea makemake nui ia no Windows a me Linux.
  3. I ka hui ʻana no kēlā me kēia OS, e hoʻohana i ka waihona i kūkulu ʻia i loko o ka compiler pili.

Ua hōʻole ʻia ka koho mua ma muli o ka nui o ka hana.

Ua noʻonoʻo mākou i ka lua o ka koho no kekahi manawa; i manaoia he moho libc++, akā i kēlā manawa ʻaʻole ia i hana ma lalo o Windows. No ka lawe ʻana i ka libc++ i Windows, pono ʻoe e hana i nā hana he nui - no ka laʻana, e kākau iā ʻoe iho i nā mea a pau e pili ana i nā kaula, ka hoʻonohonoho ʻana i ka thread a me ka atomicity, ʻoiai ua hoʻohana ʻia ka libc++ ma kēia mau wahi. API POSIX.

A koho mākou i ke ala ʻekolu.

Hoʻololi

No laila, pono mākou e hoʻololi i ka hoʻohana ʻana iā STLPort me nā hale waihona puke o nā mea hoʻopili pili (Visual Studio 2015 no Windows, gcc 7 no Linux, clang 8 no macOS).

ʻO ka mea pōmaikaʻi, ua kākau nui ʻia kā mākou code e like me nā alakaʻi a ʻaʻole i hoʻohana i nā ʻano hana akamai a pau, no laila ua hele mālie ka neʻe ʻana i nā hale waihona puke hou, me ke kōkua o nā palapala i hoʻololi i nā inoa o nā ʻano, nā papa, nā inoa a me nā mea i loko o ke kumu. waihona. Ua pili ka neʻe ʻana i nā faila kumu 10 (mai loko o 000). Ua pani ʻia ʻo wchar_t e char14_t; ua hoʻoholo mākou e haʻalele i ka hoʻohana ʻana iā wchar_t, no ka mea Lawe ʻo char000_t i 16 bytes ma nā OS a pau a ʻaʻole hoʻopau i ka hoʻohālikelike code ma waena o Windows a me Linux.

Aia kekahi mau hana liʻiliʻi. No ka laʻana, ma STLPort hiki ke hoʻolei ʻia kahi mea hoʻololi i kahi kuhikuhi i kahi mea, a ma kekahi mau wahi i kā mākou code ua hoʻohana ʻia kēia. Ma nā hale waihona puke hou ʻaʻole hiki ke hana i kēia, a pono e nānā ʻia kēia mau paukū a kākau hou ʻia me ka lima.

No laila, ua pau ka neʻe ʻana o ke code, ua hōʻuluʻulu ʻia ke code no nā ʻōnaehana hana āpau. ʻO ka manawa kēia no nā hoʻokolohua.

Hōʻike nā hoʻokolohua ma hope o ka hoʻololi ʻana i kahi hāʻule o ka hana (ma kekahi mau wahi a hiki i 20-30%) a me ka hoʻonui ʻana i ka hoʻohana ʻana i ka hoʻomanaʻo (a hiki i 10-15%) i hoʻohālikelike ʻia i ka mana kahiko o ke code. ʻO kēia, ma muli o ka hana suboptimal o nā kaula maʻamau. No laila, pono mākou e hoʻohana i kā mākou laina ponoʻī i hoʻololi iki ʻia.

Ua hōʻike pū ʻia kahi hiʻohiʻona hoihoi o ka hoʻokō ʻana i nā ipu i loko o nā hale waihona puke i hoʻopili ʻia: ʻole (me ka ʻole o nā mea) std::map a me std::set mai nā hale waihona puke e hoʻokaʻawale i ka hoʻomanaʻo. A ma muli o nā hiʻohiʻona hoʻokō, i kekahi mau wahi i loko o ke code, ua hana ʻia ka nui o nā pahu hakahaka o kēia ʻano. Hoʻokaʻawale liʻiliʻi nā pahu hoʻomanaʻo maʻamau, no hoʻokahi kumu kumu, akā no mākou ua lilo kēia i mea koʻikoʻi - ma nā ʻano hiʻohiʻona, ua hāʻule nui kā mākou hana a ua hoʻonui ʻia ka hoʻomanaʻo ʻana (hoʻohālikelike ʻia me STLPort). No laila, i kā mākou code ua hoʻololi mākou i kēia mau ʻano pahu ʻelua mai nā hale waihona puke i kūkulu ʻia me kā lākou hoʻokō ʻana mai Boost, kahi i loaʻa ʻole ai kēia mau pahu i kēia hiʻohiʻona, a ua hoʻoponopono kēia i ka pilikia me ka hoʻonui ʻana i ka hoʻomanaʻo.

E like me ka hana pinepine ʻana ma hope o ka hoʻololi nui ʻana i nā papahana nui, ʻaʻole i hana ka ʻike mua o ke code kumu me ka pilikia ʻole, a ma ʻaneʻi, ʻo ke kākoʻo no ka debugging iterators i ka hoʻokō ʻana o Windows. Ua neʻe mākou i mua i kēlā me kēia ʻanuʻu, a ma ka pūnāwai o 2017 (version 8.3.11 1C: Enterprise) ua pau ka neʻe ʻana.

Nā hopena

ʻO ka hoʻololi ʻana i ka maʻamau C++14 i lawe iā mākou ma kahi o 6 mau mahina. ʻO ka hapa nui o ka manawa, hoʻokahi (akā ʻoi loa ka mākaukau) mea hoʻomohala i hana ma ka papahana, a ma ka pae hope loa nā ʻelele o nā hui kuleana no nā wahi kikoʻī i hui pū ʻia - UI, kikowaena kikowaena, kūkulu a me nā mea hana hoʻokele, etc.

Ua maʻalahi ka hoʻololi i kā mākou hana ma ka neʻe ʻana i nā mana hou loa o ka maʻamau. No laila, ua hoʻololi ʻia ka mana 1C: Enterprise 8.3.14 (i ka hoʻomohala ʻana, hoʻokuʻu ʻia no ka makahiki e hiki mai ana) C++17.

Ma hope o ka neʻe ʻana, loaʻa i nā mea hoʻomohala nā koho hou aʻe. Inā ma mua ua loaʻa iā mākou kā mākou mana hoʻololi o STL a me hoʻokahi std namespace, i kēia manawa ua loaʻa iā mākou nā papa maʻamau mai nā hale waihona puke i kūkulu ʻia i loko o ka std namespace, i ka stdx namespace - kā mākou mau laina a me nā pahu i hoʻopaʻa ʻia no kā mākou mau hana, i ka hoʻonui ʻana - ka mana hou o ka hoonui. A hoʻohana ka mea hoʻomohala i kēlā mau papa i kūpono loa e hoʻoponopono i kāna mau pilikia.

ʻO ka hoʻokō ʻana i ka "kūpono" o nā mea kūkulu neʻe e kōkua pū i ka hoʻomohala ʻana (hoʻoneʻe i nā mea kūkulu) no kekahi mau papa. Inā he papa hana hoʻoneʻe a hoʻokomo ʻia kēia papa i loko o kahi pahu, a laila hoʻomaikaʻi ka STL i ke kope ʻana o nā mea i loko o ka ipu (e laʻana, ke hoʻonui ʻia ka ipu a pono e hoʻololi i ka hiki a hoʻololi hou i ka hoʻomanaʻo).

He puna kā

Malia paha ʻo ka hopena maikaʻi ʻole (akā ʻaʻole koʻikoʻi) o ka neʻe ʻana ʻo ia ke alo nei mākou i ka piʻi ʻana o ka nui. obj faila, a ua hoʻomaka ka hopena piha o ke kūkulu ʻana me nā faila waena a pau i 60-70 GB. ʻO kēia ʻano hana ma muli o nā ʻokoʻa o nā hale waihona puke maʻamau o kēia wā, i lilo i mea koʻikoʻi i ka nui o nā faila lawelawe i hana ʻia. ʻAʻole pili kēia i ka hana o ka noi i hōʻuluʻulu ʻia, akā ke kumu i ka nui o nā pilikia i ka hoʻomohala ʻana, ʻo ia hoʻi, hoʻonui ia i ka manawa compilation. Ke piʻi aʻe nei nā koi no kahi disk manuahi ma nā kikowaena kūkulu a ma nā mīkini hoʻomohala. Ke hana nei kā mākou mea hoʻomohala ma nā ʻano like ʻole o ka paepae, a he mau haneli gigabytes o nā faila waena i kekahi manawa e hoʻopilikia i kā lākou hana. ʻAʻole ʻoluʻolu ka pilikia, akā ʻaʻole koʻikoʻi; ua hoʻopanee mākou i kāna hopena i kēia manawa. Ke noʻonoʻo nei mākou i ka ʻenehana ʻo ia kekahi o nā koho no ka hoʻoponopono ʻana kukulu lokahi (ʻo ia hoʻi, hoʻohana ʻo Google iā ia i ka hoʻomohala ʻana i ka polokalamu kele Chrome).

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka