Làm cách nào để nhận thời lượng, dưới dạng int milli's và float giây từ <chrono>?


94

Tôi đang cố gắng sử dụng thư viện chrono để tính giờ và thời lượng.

Tôi muốn có thể có Duration frameStart;(từ khi bắt đầu ứng dụng) và Duration frameDelta;(thời gian giữa các khung hình)

Tôi cần có thể lấy frameDeltathời lượng dưới dạng mili giây và giây trôi.

Làm cách nào để bạn thực hiện việc này với các <chrono>thư viện c ++ 11 mới ? Tôi đang làm việc với nó và googling (thông tin rất thưa thớt). Mã có nhiều khuôn mẫu và yêu cầu phôi và những thứ đặc biệt, tôi không thể tìm ra cách sử dụng thư viện này một cách chính xác.


Gán thời lượng cho một khoảng thời gian với tỷ lệ giây (hoặc mili giây) và sau đó gọi countnó ...
K-bubble

auto delta = time_cast <seconds> (frameDelta) .count (); Như thế này? Nó trả về lâu dài không phải là một phao.
EddieV223

3
@ K-bubble, nếu thời lượng có độ phân giải cao hơn loại bạn gán cho nó thì bài tập sẽ không được định hình, để tránh mất độ chính xác. Bạn cần phải sử dụng một thời gian với một đại diện dấu chấm động, hoặc sử dụngduration_cast
Jonathan Wakely

@JonathanWakely: Ồ, vậy thì tôi đã sử dụng nó sai rồi! :(
K-ball

Câu trả lời:


153

Đây có phải là những gì bạn đang tìm kiếm?

#include <chrono>
#include <iostream>

int main()
{
    typedef std::chrono::high_resolution_clock Time;
    typedef std::chrono::milliseconds ms;
    typedef std::chrono::duration<float> fsec;
    auto t0 = Time::now();
    auto t1 = Time::now();
    fsec fs = t1 - t0;
    ms d = std::chrono::duration_cast<ms>(fs);
    std::cout << fs.count() << "s\n";
    std::cout << d.count() << "ms\n";
}

cái mà cho tôi in ra:

6.5e-08s
0ms

2
tại sao không sử dụng autotrên fsd?
TemplateRex

27
@rhalbersma: Sử dụng autosẽ tốt d, vì kết quả duration_cast<ms>ms. Tuy nhiên for fs autosẽ không thích hợp vì kết quả của t1-t0loại has high_resolution_clock::durationkhông nhất thiết phải cùng loại với duration<float>. Ví dụ trên hệ thống của tôi, nó là duration<long long, nano>. Vì vậy, có một sự chuyển đổi ngầm định từ dựa trên tích phân nanosecondssang dựa trên thực thể secondsxảy ra trên dòng đó, chỉ vì loại đích được chỉ định với fsec.
Howard Hinnant

2
Đó là thông tin hữu ích. Chỉ tò mò: sẽ auto fs = std::chrono::duration_cast<fsec>(t1 - t0);là quá mức cần thiết?
TemplateRex

@rhalbersma: Điều đó cũng hoạt động tốt và làm điều tương tự. Theo như tôi quan tâm thì cái nào nên được ưu tiên hoàn toàn là phong cách.
Howard Hinnant

2
lưu ý rằng trong một số kịch bản thế giới thực (trình biên dịch ms và thư viện chẳng hạn) của high_resolution_clock 'sẽ bỏ lỡ lần vào thứ tự của micro và mã này sẽ nhổ ra zero,
jheriko

19

Đoán xem bạn đang yêu cầu gì. Tôi giả sử bằng bộ đếm thời gian khung hình mili giây bạn đang tìm kiếm thứ gì đó hoạt động như sau,

double mticks()
{
    struct timeval tv;
    gettimeofday(&tv, 0);
    return (double) tv.tv_usec / 1000 + tv.tv_sec * 1000;
}

nhưng sử dụng std::chronothay thế,

double mticks()
{
    typedef std::chrono::high_resolution_clock clock;
    typedef std::chrono::duration<float, std::milli> duration;

    static clock::time_point start = clock::now();
    duration elapsed = clock::now() - start;
    return elapsed.count();
}

Hi vọng điêu nay co ich.


Chào mừng bạn đến với Stack Overflow. Sẽ thật tuyệt nếu bạn có thể cung cấp chi tiết bổ sung cho mã của mình. Nó sẽ giúp người khác hiểu những gì bạn đang cố gắng hoàn thành và cách giải pháp của bạn hoạt động. Cảm ơn!
Luís Cruz

FYI - đây là ví dụ RÕ RÀNG nhất, hữu ích nhất trong số hàng tá tôi đã xem xét. Cảm ơn bạn đã làm cho các chức năng chrono khó hiểu vĩnh viễn có thể hiểu được.
SMGreenfield

15

Tôi không biết "mili giây và giây trôi" có nghĩa là gì, nhưng điều này sẽ cho bạn một ý tưởng:

#include <chrono>
#include <thread>
#include <iostream>

int main()
{
  auto then = std::chrono::system_clock::now();
  std::this_thread::sleep_for(std::chrono::seconds(1));
  auto now = std::chrono::system_clock::now();
  auto dur = now - then;
  typedef std::chrono::duration<float> float_seconds;
  auto secs = std::chrono::duration_cast<float_seconds>(dur);
  std::cout << secs.count() << '\n';
}

Tôi đoán anh ấy muốn thực tế countnhư một float?
K-ball

1
Đó là những gì được in ở cuối. Nhưng tôi không biết liệu anh ấy muốn mili giây dưới dạng số nguyên, hay mili giây sau giây hay cái gì.
Jonathan Wakely

Tôi muốn để có thể nhận được từ một chrono :: Thời gian trong suốt thời gian biểu diễn như một int mili giây, hoặc giây float (phần nhỏ của một giây)
EddieV223

Howard câu trả lời không chính xác điều đó
Jonathan Wakely

8

kiểu AAA sử dụng thành ngữ khởi tạo được nhập rõ ràng :

#include <chrono>
#include <iostream>

int main(){
  auto start = std::chrono::high_resolution_clock::now();
  // Code to time here...
  auto end = std::chrono::high_resolution_clock::now();

  auto dur = end - start;
  auto i_millis = std::chrono::duration_cast<std::chrono::milliseconds>(dur);
  auto f_secs = std::chrono::duration_cast<std::chrono::duration<float>>(dur);
  std::cout << i_millis.count() << '\n';
  std::cout << f_secs.count() << '\n';
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.