2013-03-15 7 views
1

У меня есть две функции ниже. Я выполняю каждый из них около 200 тыс. Раз, со случайными отсортированными векторами (каждая функция получает те же два вектора, но векторы меняются между прогонами). Я немного смущен, потому что мой код работает примерно в 500 мс для всех итераций 200 КБ, тогда как вызов функции STD выполняется в 440 мс. Куда идет ~ 60 мс? Что делает STD (или не делает), что я сделал по-другому?Почему мой код для set_intersection медленнее, чем std?

Я использую Visual Studio 10 на ядре i5.

int getAndIntersectMine(std::vector<int>& resultContainer) 
{ 
    std::vector<int> const& vector0 = getSomeVector(); 
    std::vector<int> const& vector1 = getAnotherVector(); 

    const int length0 = vector0.size(); 
    const int length1 = vector1.size(); 

    const int* ptr0 = &vector0[0]; 
    const int* ptr1 = &vector1[0]; 

    int i0 = 0; 
    int i1 = 0; 
    int numels = 0; 

    while(i0 < length0 && i1 < length1) 
    { 
     if(ptr0[i0] == ptr1 [i1]) { 
     resultContainer[numels++] = ptr0[i0]; 
     i0++; 
     i1++; 
     } 
     else if (ptr0[i0] > ptr1[i1]) 
     { 
     i1++; 
     } 
     else 
     { 
     i0++; 
     } 
    } 

    return numels; 
} 


int getAndIntersectStds(std::vector<int>& resultContainer) 
{ 
    std::vector<int> const& vector0 = getSomeVector(); 
    std::vector<int> const& vector1 = getAnotherVector(); 

    std::vector<int>::iterator last = 
     std::set_intersection(
     vector0.begin(), 
     vector0.end(), 
     vector1.begin(), 
     vector1.end(), 
     resultContainer.begin()); 

    return last - resultContainer.begin(); 
} 
+2

как вы измерили? 60 мс не так много и может быть ошибкой измерения, а также – stefan

+0

'getAndIntersectStds' также получает параметр' std :: vector const & resultContainer', правильно? – Shahbaz

+5

Так как это шаблонный код, вы можете просто посмотреть версию 'std' правильно? –

ответ

1

Я думаю, проблема заключается в том, что вы используете подписку вместо итераторов.

в то время как итерация алгоритма зЬй делает (в указателю экв.)

int * beg = &v[0]; 
int * end = &v[0] + v.size(); 
while(beg != end) 
{ 
    ... 
    ++beg; 
} 

ваш более arithmeic протяжения

int * beg = &v[0]; 
int i = 0, s = v.size(); 
while(i != s) 
{ 
    //use beg[i], which is *(beg + i) 
    ... 
    ++i; 
} 

А также разместить приращение ... но я думаю, что он оптимизирован

+0

Is '

+ 1' дешевле, чем'
+ '? – Nick

+3

@anjruu: вы приняли этот ответ. Означает ли это, что вы внесли соответствующие изменения и что разница в производительности исчезла, когда вы это сделали? –

+0

@ Nick Я имел в виду, что он также увеличивает счетчик на каждой итерации – kassak

 Смежные вопросы

  • Нет связанных вопросов^_^