2013-02-18 27 views
5

Tôi tình cờ chạy vào nguồn của std::find và thấy nó gây nhầm lẫn cho tôi. Về cơ bản, nó chia số lượng mục cho 4 và thực hiện so sánh 4 trong mỗi vòng:Tại sao std :: find thực hiện theo cách này?

template<typename _RandomAccessIterator, typename _Tp> 
_RandomAccessIterator 
__find(_RandomAccessIterator __first, _RandomAccessIterator __last, 
    const _Tp& __val, random_access_iterator_tag) 
{ 
    typename iterator_traits<_RandomAccessIterator>::difference_type 
__trip_count = (__last - __first) >> 2; 

    for (; __trip_count > 0; --__trip_count) 
{ 
    if (*__first == __val) 
    return __first; 
    ++__first; 

    if (*__first == __val) 
    return __first; 
    ++__first; 

    if (*__first == __val) 
    return __first; 
    ++__first; 

    if (*__first == __val) 
    return __first; 
    ++__first; 
} 

    switch (__last - __first) 
{ 
case 3: 
    if (*__first == __val) 
    return __first; 
    ++__first; 
case 2: 
    if (*__first == __val) 
    return __first; 
    ++__first; 
case 1: 
    if (*__first == __val) 
    return __first; 
    ++__first; 
case 0: 
default: 
    return __last; 
} 
} 

Tôi không biết tại sao nó lại được thực hiện theo cách này. Hình như một số tối ưu hóa. Nhưng tôi không nghĩ rằng điều này sẽ tận dụng lợi thế của đa lõi dễ dàng. Đây là một chủ đề duy nhất anyway.

Bất kỳ ý tưởng nào?

+4

Dường như bỏ vòng lặp thủ công. Whence là việc thực hiện này? –

+0

Đối với một điều, nó dành ít thời gian so sánh '__trip_count' với 0 và nhiều thời gian hơn so sánh giá trị. –

Trả lời

4

Đó là việc bỏ vòng lặp. Kết quả là như nhau, nhưng nó thân thiện hơn với bộ vi xử lý.

Sự phức tạp tiệm cận là như nhau.

-2

Đó là Duff's device. Đó là một kỹ thuật tối ưu hóa cũ kết hợp trong khi và chuyển đổi câu lệnh theo cách đặc biệt. Nó sử dụng vòng lặp unroling. Trong assembler bạn sẽ nhảy ngay bên trong một vòng lặp chưa được kiểm soát.

+5

Không phải thiết bị của Duff, câu lệnh chuyển đổi không nằm trong vòng lặp. Rất có thể mã được phát ra sẽ nhỏ hơn nếu nó sử dụng thiết bị của Duff. –

+0

Ok lỗi của tôi. Tôi đã không đọc mã đủ cẩn thận. –

+0

@SteveJessop: Tôi đã bị ấn tượng khi bạn đặt thiết bị của duff vào cuối vòng lặp chưa được kiểm soát chứ không phải bên trong nó. Chỉ có lần lặp cuối sẽ có số lượng không đầy đủ. –

Các vấn đề liên quan