Дар аввал мо коди платформаи 1C: Enterprise 8-ро бо истифода аз Microsoft Visual Studio навиштем. Лоиҳа дар аввали солҳои 2000-ум оғоз ёфт ва мо версияи танҳо барои Windows доштем. Табиист, ки аз он вақт инҷониб код фаъолона таҳия карда шуд, бисёр механизмҳо комилан аз нав навишта шуданд. Аммо код мувофиқи стандарти соли 1998 навишта шуда буд ва масалан, мо барои бомуваффақият тартиб додан қавсҳои кунҷи ростро бо фазо ҷудо кардем, ба монанди:
vector<vector<int> > IntV;
Дар соли 2006, бо нашри платформаи версияи 8.1, мо дастгирии Linux-ро оғоз кардем ва ба китобхонаи стандартии тарафи сеюм гузаштем. STLPort. Яке аз сабабҳои гузариш ин кор бо сатрҳои васеъ буд. Мо std::wstring-ро дар тамоми коди худ истифода мебарем, ки он ба навъи wchar_t асос ёфтааст. Андозаи он дар Windows 2 байт ва бо нобаёнӣ дар Linux 4 байт аст. Ин ба номувофиқатии протоколҳои бинарии мо байни муштарӣ ва сервер ва инчунин маълумоти гуногуни доимӣ оварда расонд. Бо имконоти gcc, шумо метавонед муайян кунед, ки андозаи wchar_t ҳангоми тартибдиҳӣ низ 2 байт аст, аммо пас шумо метавонед истифодаи китобхонаи стандартиро аз компилятор фаромӯш кунед, зеро он glibc-ро истифода мебарад, ки дар навбати худ ба wchar_t 4-байт тартиб дода мешавад. Сабабҳои дигар татбиқи беҳтари синфҳои стандартӣ, дастгирии ҷадвалҳои ҳаш ва ҳатто эмулясияи семантикаи ҳаракат дар дохили контейнерҳо буданд, ки мо онҳоро фаъолона истифода мебурдем. Ва як сабаби дигар, чунон ки мегӯянд, охирин, вале на камтар аз он, иҷрои сатр буд. Мо барои сатрҳо синфи худро доштем, зеро Бо назардошти хусусиятҳои нармафзори мо, мо амалиёти сатриро хеле васеъ истифода мебарем ва ин барои мо муҳим аст.
Сатри мо ба ғояҳои оптимизатсияи сатр асос ёфтааст, ки дар аввали солҳои 2000-ум ифода шуда буданд Андрей Александреску. Баъдтар, вақте ки Александреску дар Facebook кор мекард, бо пешниҳоди ӯ, дар муҳаррики Facebook сатр истифода шуд, ки бо принсипҳои шабеҳ кор мекунад (нигаред ба китобхона беақлӣ).
Хушбахтона, рамзи мо асосан аз рӯи дастурҳо навишта шуда буд ва аз ҳар гуна ҳиллаҳои душвор истифода набурд, аз ин рӯ, муҳоҷират ба китобхонаҳои нав бо истифода аз скриптҳое, ки номҳои намудҳо, синфҳо, фазои номҳоро иваз мекарданд ва ба файлҳои сарчашма дохил мешаванд, нисбатан осонтар идома ёфт. Муҳоҷират ба 10 файли манбаъ (аз 000) таъсир расонд. wchar_t бо char14_t иваз карда шуд; мо тасмим гирифтем, ки истифодаи wchar_t-ро бас кунем, зеро char000_t дар ҳама OS 16 байтро ишғол мекунад ва мутобиқати кодро байни Windows ва Linux вайрон намекунад.
Якчанд саргузаштҳои хурде буданд. Масалан, дар STLPort, итератор метавонад ба таври ғайримустақим ба нишоннамои элемент интиқол дода шавад ва ин дар баъзе ҷойҳо дар коди мо истифода мешуд. Дар китобхонахои нав ин кор дигар имконнопазир буд ва ин порчахоро дастй тахлил ва аз нав навиштан лозим омад.
Ҳамин тавр, интиқоли код анҷом ёфт, код барои ҳама системаҳои оператсионӣ тартиб дода мешавад. Вақти санҷишҳо расидааст.
Санҷишҳо пас аз гузариш дар муқоиса бо версияи пешинаи код коҳиши кор (дар баъзе ҷойҳо то 20-30%) ва афзоиши истеъмоли хотира (то 10-15%) нишон доданд. Ин, алалхусус, аз сабаби иҷрои номунтазами сатрҳои стандартӣ буд. Аз ин рӯ, мо маҷбур шудем, ки хати худамонро каме тағир додем.
Хусусияти ҷолиби татбиқи контейнерҳо дар китобхонаҳои дохилшуда низ ошкор карда шуд: холӣ (бе элементҳо) std::map ва std::set аз китобхонаҳои дарунсохт хотира ҷудо мекунанд. Дар мамлакати мо бошад, бинобар хусусиятхои ба амал баровардани он дар баъзе чойхои код хеле зиёд зарфхои холии ин навъ ба вучуд оварда мешаванд. Онҳо контейнерҳои хотираи стандартиро барои як унсури реша каме ҷудо мекунанд, аммо барои мо ин муҳим буд - дар як қатор сенарияҳо, иҷрои мо ба таври назаррас коҳиш ёфт ва истеъмоли хотира афзоиш ёфт (нисбат ба STLPort). Аз ин рӯ, дар коди худ, мо ин ду намуди контейнерҳоро аз китобхонаҳои дарунсохт бо татбиқи онҳо аз Boost иваз кардем, ки дар он контейнерҳо ин хусусият надоштанд ва ин мушкилотро бо сустшавӣ ва зиёд шудани истеъмоли хотира ҳал кард.