2012-03-15 23 views
6

Trong khi chơi với VS11 beta tôi nhận thấy một cái gì đó kỳ lạ: mã này coutsTrình biên dịch có thể sắp xếp lại mã qua các lệnh gọi tới std :: chrono :: system_clock :: now()?

f mất 0 mili giây

int main() 
{ 
    std::vector<int> v; 
    size_t length =64*1024*1024; 
    for (int i = 0; i < length; i++) 
    { 
     v.push_back(rand()); 
    } 

    uint64_t sum=0; 
    auto t1 = std::chrono::system_clock::now(); 
    for (size_t i=0;i<v.size();++i) 
     sum+=v[i]; 
    //std::cout << sum << std::endl; 
    auto t2 = std::chrono::system_clock::now(); 
    std::cout << "f() took " 
     << std::chrono::duration_cast<std::chrono::milliseconds>(t2-t1).count() 
       << " milliseconds\n"; 


} 

Nhưng khi tôi quyết định bỏ ghi chú dòng với couting số tiền sau đó nó in ra một số hợp lý.

Đây là hành vi của tôi nhận được với tối ưu hóa kích hoạt, với họ tàn tật tôi nhận được "bình thường" cout

f() mất 471 mili giây

Vì vậy, là hành vi tuân thủ tiêu chuẩn này? Quan trọng: nó không phải là mã chết được tối ưu hóa đi, tôi có thể thấy sự chậm trễ khi chạy từ giao diện điều khiển, và tôi có thể thấy CPU tăng đột biến trong Task Manager.

Trả lời

9

tôi đoán là đây là chết tối ưu hóa mã - và đó tăng vọt tải của bạn là do công việc khởi tạo vector không được tối ưu hóa, tuy nhiên, tính toán của không sử dụng sum biến của bạn là.

Nhưng khi tôi quyết định bỏ ghi chú dòng với couting số tiền thì nó in ra một số hợp lý.

Điều đó đi cùng với lý thuyết của tôi, có - khi bạn buộc phải sử dụng kết quả tính toán, bản thân tính toán không thể được tối ưu hóa.

Nếu bạn muốn xác nhận thêm, hãy làm cho chương trình của bạn nói khi nó sẵn sàng và tạm dừng để bạn nhấn trở lại - điều đó sẽ cho phép bạn đợi cho bất kỳ đột biến CPU nào rõ ràng "biến mất" trước khi bạn nhấn trở lại. cho bạn tự tin hơn về những gì gây ra nó.

+0

Đã kiểm tra, bạn nói đúng, nhưng bây giờ tôi đã nhầm lẫn, nếu thông minh để hiểu rằng tổng hợp không được sử dụng tại sao nó thực hiện khởi tạo? Tôi đoán nó không thể chứng minh rằng rand() không có tác dụng phụ ... – NoSenseEtAl

+0

ouch ... ofc nó không thể chứng minh rằng rand không có tác dụng phụ-rand isnt một chức năng tinh khiết ... nó có nhà nước. :) nhưng thậm chí thay thế rand() với tôi vẫn không ngăn chặn khởi tạo ... – NoSenseEtAl

+0

@NoSenseEtAl: Vâng khởi tạo không hoạt động bằng cách sử dụng 'push_back' ... do đó, tôi đoán là mặc dù trình biên dịch có thể có thể nói rằng' v 'chỉ được sử dụng sau này theo những cách nó có thể loại bỏ, nó không phải là hạnh phúc để giả định rằng' push_back() 'sẽ không có tác dụng phụ khác. Tôi không muốn nói chắc chắn. –

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