Loading...
Jovanna avatar Jovanna 186 Точки

Защо нормализацията бави? //task04.04-Resources, C++ Advanced

Здравейте,

Защо вариант 1/  с викане на нормализираща функция е много по - бавен, отколкото директно в кода на овърлоуднатия оператор да са if-else -овете  ( а кода на нормализиращата функция е реализирана по същия начин с if-else -ове) ?        Дава :  Time used: 0.068 s   ,  Memory used: 3.84 MB    почти на всеки тест

нормализиращата функция работи с const реф.: static enum ResourceType& normalizeStringToEnum(const std::string& ts) {...)

 вариант 1/ с нормализираща функция:

   void operator>>(std::istream& in, Resource& r) {           
        in >> r.id;
        std::string ts;
        in >> ts;
        r.typeE = Resource::normalizeStringToEnum(ts);  
        in >> r.link;            
    }

При вариант 2/ нормализиращата функция се вика само от инициализационния списък на конструктора, а в овърлоуднатия оператор >> логиката е с if-else -ове за енумерацията. Много бърз вариант и минава в Judge.     Дава: Time used: 0.000 s,  Memory used: 1.90 MB  почти на всеки тест.

Защо?

Тагове:
0
C++ Programming
georgi.stef.georgiev avatar georgi.stef.georgiev 921 Точки

Здравей,

Конкретно за тази задача, времената, които системата докладва, не са много информативни, защото тестовете са малки (най-големият има 50 ресурса), съответно разликите във времето са предимно плод на конкретното изпълнение и натовареността на системата, не толкова на самия код, който ползваш. Тоест ако качиш същото решение отново, е доста вероятно да получиш различно време. Като цяло ако виждаш, че стойностите за времето са много близки до нула (под 0.1), за която и да е задача, не разчитай твърде много на judge резултатите да определиш бързодействие.

Иначе всяко викане на функция отнема допълнително константно време - допълнително спрямо варианта, в който копираш кода на функцията на мястото, където се вика. Просто така са устроени нещата в компютърната памет - за да се повика функция, трябва да се отиде на мястото, където е дефинирана в паметта, а това е една допълнителна стъпка. Не е голяма разлика и обикновено е пренебрежима, но я има.

Поздрави,

Жоро

P.S.: това по-скоро е parse-ваща функция, не нормализираща функция. Нормализиращите функции обръщат стойност от един тип в стойност от същия тип (примерно lower case за string), докато функции, които обръщат един тип в друг тип, особено ако тръгват от string запис, обикновенно се наричат parsing функции.

1
02/10/2018 16:48:27
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.