Стоимость передачи необязательного параметра методу, а не его вычисления - PullRequest
0 голосов
/ 10 июля 2009

У меня есть блок памяти, который разделен на серию местоположений, которые могут быть получены и возвращены клиентским кодом.
Метод, который возвращает местоположения назад, выглядит следующим образом:

void ReturnLocation(void *address) {
    int location = AddressToLocation(address); // I need the location here
    // some code
    DoSmthA(location);
}

void DoSmthA(int location) {
    // I need the address, but also the location
    void *address = LocationToAddress(location); 
    // do something with the address
    DoSmthB(location);
}

void DoSmthB(int location) {
    // Again, I need the address, but also the location
    void *address = LocationToAddress(location);
    // do something with the address
    DoSmthC(location); // It may go on this way...
}

// ------------------------------------------------------
void* LocationToAddress(int location)
{
    return (void *)((char *)this + HEADER_SIZE + (location * LocationSize));
}

int AddressToLocation(void *address)
{
    return (int)(((__int64)address - HEADER_SIZE - (__int64)this) / LocationSize);
}  

У меня такой вопрос: я должен передавать только местоположение вспомогательным методам, или он будет проходить быстрее каждый раз, когда адрес тоже (и не вычислять его снова и снова):

void DoSmthA(int location, void *address) { }  

или даже лучше использовать такую ​​структуру:

struct LocationInfo { int Location; void *Address; };
void DoSmthA(LocationInfo locInfo) { }

Этот метод может вызываться миллион раз, и я не уверен, что операции по вычислению адреса из местоположения (два сложения и одно умножение) выполняются быстрее или медленнее, чем передача второго параметра, содержащего адрес.

Заранее спасибо!

Ответы [ 3 ]

8 голосов
/ 10 июля 2009

Профиль. Делайте то, что на самом деле быстрее в вашем случае, на вашем компиляторе и с вашей базой кода. Не то, что было быстрее в моем несвязанном тесте на моем несвязанном компиляторе.

Передача аргумента функции - довольно дешевая операция. Пуш / поп стек, в основном.

Вычисление местоположения может быть очень быстрым, если деление может быть оптимизировано вне (зависит от значения LocationSize и того, известно ли оно во время компиляции).

Так что попробуйте оба, посмотрите, что быстрее в реальном мире.

ЦП - сложные звери, и производительность не тривиальна.

4 голосов
/ 10 июля 2009

Вы попадаете в такую ​​оптимизацию, когда различные комбинации процессора / компилятора и даже контроллера памяти могут иметь значение. Мы говорим только о 1 000 000 операций, если вы не добавите к нему несколько 0, я не думаю, что вы даже сможете измерить разницу в производительности. Итак, делайте все, что проще для обслуживания. Время разработчика составляет 100 раз машинного времени IMO.

2 голосов
/ 10 июля 2009

Предполагая, что вы действительно знаете, что это узкое место (вы обнаружили это, запустив профилировщик, а не просто «зная», что его миллион прогонов является узким местом, верно?), Правильное решение - попробовать каждый и посмотреть, какие один имеет лучшее улучшение. Или просмотреть сгенерированную сборку и посмотреть, какая из них лучше, если вы сошли с ума.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...