Loading...
zzerro avatar zzerro 16 Точки

Референция срещу пойнтер

Здравейте!

За първа задача джъджа дава разлика в паметта и скоростта в полза на пойнтера в следните случаи:

//variant 1 use function by pointer
//Memory: 1.86 MB
//Time: 0.000 s

std::string minBy(std::vector<std::string> &values,
                  bool (*whichFn)(const std::string& , const std::string& ))
{
    sort(values.begin(), values.end(), whichFn);

    return values[0];
}

//variant 2 use function by reference
//Memory: 1.88 MB
//Time: 0.015 s

std::string minBy(std::vector<std::string> &values,
                  bool (&whichFn)(const std::string& , const std::string& ))
{
    sort(values.begin(), values.end(), whichFn);

    return values[0];
}

Има ли наистина разлика?

Тагове:
0
C++ Advanced
MartinBG avatar MartinBG 4803 Точки

На теория не би следвало да има разлика.

На практика - дори и да има, е малко вероятно да е осезаема.

При всички случаи, Judge не е надежден инструмент за измерване на памет или бързодействие и ако ни трябват реални резултати за конкретна система и компилатор, единственият начин да ги получим, е като изпълним приложението на тази система и засечем нужните ни показатели (т.е. напиши си тестове и тествай на системата си дали има разлики в скоростта/паметта).

1
04/12/2019 23:35:13
zzerro avatar zzerro 16 Точки

Аз се изненадах не толкова за разликата в скоростта, но заради паметта. Не знам как да си напиша тестове.

0
05/12/2019 23:22:52
zzerro avatar zzerro 16 Точки

Пробвам това, но винаги дава различен резултат

#include <iostream>
#define UNITS 100000000
#include<ctime>

int plus5(int x)
{
    return x + 5;
}

int minus5(int x)
{
    return x - 5;
}

int varyCalc(int x, int (*whichFn)(int))
{
    return whichFn(x);
}

int main()
{
    int *intArr = new int[UNITS];

    clock_t startTime = clock(); //time counter starts
    for(int i = 0; i < UNITS; ++i)
    {
        *(intArr+i) = varyCalc(i, plus5);
        ++i;
        *(intArr+i) = varyCalc(i, minus5);
    }

    std::cout << ((float)clock() - startTime)/CLOCKS_PER_SEC;

    std::cout << std::endl;
    system("pause");

    delete []intArr;
    return 0;
}

 

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