2011-10-25 44 views
22

Tôi có một vấn đề ngu ngốc. Tôi cố gắng chuyển sang tiêu đề C++ 11 và một trong số đó là chrono. Nhưng vấn đề của tôi là tôi không thể cout kết quả của các hoạt động thời gian. Ví dụ:std :: chrono và cout

auto t=std::chrono::high_resolution_clock::now(); 
cout<<t.time_since_epoch(); 

cho:

khởi tạo tham số 1 của ‘std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&&, const _Tp&) [with _CharT = char, _Traits = std::char_traits<char>, _Tp = std::chrono::duration<long int, std::ratio<1l, 1000000l> >]’ ... /usr/include/c++/4.6/ostream

cout<<(uint64_t)t.time_since_epoch(); 

cho dàn diễn viên không hợp lệ

Trả lời

20

Google nhanh chóng se vòm tìm thấy trang này: http://en.cppreference.com/w/cpp/chrono/duration, nơi bạn có thể tìm thấy ví dụ về thời lượng in.

Edit: nó đã chuyển đến http://en.cppreference.com/w/cpp/chrono/duration/duration_cast

+0

tôi sử dụng wiki đó, nhưng tôi chưa bao giờ tìm thấy nó ... tnx – NoSenseEtAl

+0

Hãy coi chừng rằng ví dụ được liên kết là khác nhau ở chỗ nó in ra sự khác biệt giữa hai lời gọi hiện tại(), và không liên quan đến time_since_epoch().Trong thực tế, time_since_epoch lá epoch thực tế không xác định (nó phụ thuộc vào đồng hồ mà từ đó bạn đã nhận được time_point). Vì vậy, trong ngắn hạn, thời gian bạn đang in ấn là vô nghĩa nếu không có thông tin kèm theo về thời đại. –

7

Không chắc chắn những gì bạn mong đợi từ dàn diễn viên này, có thể bạn muốn t.time_since_epoch().count()?

29

Như những người khác đã lưu ý, bạn có thể gọi hàm thành viên count() để nhận số nội bộ.

Tôi muốn thêm rằng tôi đang cố gắng thêm tiêu đề mới: <chrono_io> vào thư viện này. Nó được ghi thành here. Ưu điểm chính của <chrono_io> chỉ sử dụng count() là các đơn vị biên dịch được in ra cho bạn. Tất nhiên, thông tin này có thể đạt được bằng tay, nhưng dễ dàng hơn để có thư viện cho nó.

Đối với tôi, ví dụ của bạn:

#include <iostream> 
#include <chrono_io> 

int main() 
{ 
    auto t = std::chrono::high_resolution_clock::now(); 
    std::cout << t.time_since_epoch() << '\n'; 
} 

Đầu ra:

147901305796958 nanoseconds 

Các mã nguồn để làm điều này là mã nguồn mở và có sẵn tại liên kết ở trên. Nó bao gồm hai tiêu đề: <ratio_io><chrono_io> và 1 nguồn: chrono_io.cpp.

Mã này phải được xem là thử nghiệm. Nó không phải là tiêu chuẩn, và gần như chắc chắn sẽ không được chuẩn hóa như vậy. Thật vậy, những nhận xét sơ bộ từ LWG cho thấy rằng họ thích đầu ra mặc định hơn là phần mềm này gọi là "dạng ngắn". sản lượng thay thế này có thể thu được với:

std::cout << std::chrono::duration_fmt(std::chrono::symbol) 
      << t.time_since_epoch() << '\n'; 

Và kết quả đầu ra:

147901305796958 ns 
+0

Bởi câu hỏi ban đầu của tôi bạn có thể đoán tôi không phải là một guru cpp :), nhưng tại sao bạn không quá tải time_since_epoch t.time_since_epoch (chrono :: print_unit) – NoSenseEtAl

+1

Tại thời điểm này có rất ít chrono rất kinh nghiệm trên hành tinh. Vì vậy, bạn đang làm tốt! :-) Tôi có thể đã hiểu lầm đề xuất của bạn, nhưng có vẻ như bạn đang đề xuất thiết lập đơn vị thời lượng, ít nhất là cho mục đích in. Điều này có thể gây ra các chuyển đổi không chính xác để âm thầm diễn ra, mà thiết kế của chrono đã gặp rắc rối để ngăn chặn. I E. các loại thời lượng khác nhau sẽ chỉ chuyển đổi hoàn toàn nếu không có lỗi cắt ngắn được thực hiện bởi chuyển đổi. –

+0

những gì tôi có nghĩa là bạn quá tải chức năng và quá tải trở lại std :: chuỗi có đơn vị gắn bó với kết thúc. hoặc bạn có thể có các tham số khác nhau thay vì print_unit có print_nano, print_milli hoặc thậm chí print_unit ... hoặc chỉ để cập nhật (w) cout để lấy (với <<) print_units ... (aka std :: cout << chrono :: print_units << t.time_ ...) quan điểm của tôi là giải pháp tiêu đề chỉ để in được thực hiện đúng cách có vẻ lộn xộn. Và sẽ cung cấp cho đạn để kẻ thù ... "bạn muốn in đơn vị thời gian? Có một tiêu đề cho nó, BTW nó sẽ không được tiêu chuẩn hóa cho 5 y." :) – NoSenseEtAl

7

Nếu bạn muốn thời gian ở độ phân giải mili giây đây là cách bạn có thể làm điều đó:

auto t1 = std::chrono::high_resolution_clock::now(); 
//process to be timed 
auto t2 = std::chrono::high_resolution_clock::now(); 
std::cout << "process took: " 
    << std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1).count() 
    << " milliseconds\n"; 

Don' đừng quên thêm vào các tiêu đề được bao gồm:

#include <chrono> //timing 
Các vấn đề liên quan