Ruby에서 경과 시간을 밀리 초 단위로 얻으려면 어떻게해야합니까?


98

내가 Time물건을 얻은 경우 :

Time.now

나중에 동일한 줄로 다른 개체를 인스턴스화합니다. 몇 밀리 초가 지 났는지 어떻게 알 수 있습니까? 두 번째 개체는 같은 분, 다음 분 또는 몇 시간 동안 생성 될 수 있습니다.

답변:


133

이미 언급했듯이 Time 숫자 (또는 부동 소수점) 값인 것처럼 객체 . 이러한 작업은 쉽게 변환 할 수있는 두 번째 해상도를 생성합니다.

예를 들면 :

def time_diff_milli(start, finish)
   (finish - start) * 1000.0
end

t1 = Time.now
# arbitrary elapsed time
t2 = Time.now

msecs = time_diff_milli t1, t2

잘라낼 지 여부를 결정해야합니다.


2
to_i를 추가하면 정수로 사용됩니다. 예 : ((finish-start) * 1000.0) .to_i
Travis Reeder

finish.to_f - start.to_f?
bodacious

1
finish - start부동 소수점을 생성합니다. .to_f중복됩니다.
ezpz 2014

5
레일 또는 활성 지원을 사용하는 경우 #in_milliseconds 메서드를 사용하여 동일한 변환을 수행 할 수 있습니다. (t2 - t1).in_milliseconds
Nathan Hanna

58

다음과 같이 위의 솔루션에 약간의 구문 설탕을 추가 할 수 있습니다.

class Time
  def to_ms
    (self.to_f * 1000.0).to_i
  end
end

start_time = Time.now
sleep(3)
end_time = Time.now
elapsed_time = end_time.to_ms - start_time.to_ms  # => 3004

31

대답이 잘못 선택되었다고 생각합니다. 그 방법은 밀리 초가 아닌 초를 제공합니다.

t = Time.now.t­o_f
=> 1382471965.146

여기에서는 부동 값이 밀리 초라고 가정합니다.


1
선택한 답이 맞습니다. 더하기 또는 빼기를 사용 Time.now하는 것은 시간을 소수점 앞의 초와 소수점 뒤의 최대 나노초 (nsec가 완전히 정확하지 않을 수 있음)의 부동 소수점 값으로 처리하는 것입니다. 따라서이 값을 곱 1000.0하면 밀리 초가됩니다.
dfherr

예,하지만 "Time.now"만주는 것은 정확하지 않으며 질문에 정확하게 대답하지 않습니다.
LowFieldTheory

12

밀리 초 단위로 시간을 얻으려면를 추가 .round(3)하는 것이 더 좋으므로 경우에 따라 더 정확할 것입니다.

puts Time.now.to_f # => 1453402722.577573

(Time.now.to_f.round(3)*1000).to_i  # => 1453402722578

9

ezpz의 대답은 거의 완벽하지만 조금 더 추가 할 수 있기를 바랍니다.

Geo는 시간에 대해 밀리 초 단위로 물었습니다. 이것은 정수량처럼 들리며 부동 소수점 땅을 우회하지 않을 것입니다. 따라서 내 접근 방식은 다음과 같습니다.

irb(main):038:0> t8 = Time.now
=> Sun Nov 01 15:18:04 +0100 2009
irb(main):039:0> t9 = Time.now
=> Sun Nov 01 15:18:18 +0100 2009
irb(main):040:0> dif = t9 - t8
=> 13.940166
irb(main):041:0> (1000 * dif).to_i
=> 13940

정수 1000을 곱하면 분수가 완벽하게 보존되며 조금 더 빠를 수 있습니다.

날짜와 시간을 다루는 경우 DateTime 클래스 를 사용해야 할 수 있습니다 . 이것은 유사하게 작동하지만 변환 계수는 24 * 3600 * 1000 = 86400000입니다. 입니다.

DateTime의 strptimestrftime 함수는 날짜 / 시간 문자열 (예 : 로그로 /부터)을 구문 분석하고 형식화하는 데 매우 유용합니다. 알아두면 편리한 것은 다음과 같습니다.

  • 이러한 함수의 형식화 문자 (% H, % M, % S, ...)는 Unix / Linux 시스템에서 볼 수있는 C 함수의 경우와 거의 동일합니다. 과

  • 몇 가지 더 있습니다. 특히 % L 은 밀리 초를 수행합니다!


알아 둘만 한! 감사합니다 unknown:)
Geo

1
어쨌든 % L은 Ruby 1.9에만 존재합니다.)
Rafa de Castro

7
DateTime.now.strftime("%Q")

사용 예 :

>> DateTime.now.strftime("%Q")
=> "1541433332357"

>> DateTime.now.strftime("%Q").to_i
=> 1541433332357

6

Time.now.to_f 는 당신을 도울 수 있지만 초를 반환합니다.

일반적으로 벤치 마크로 작업 할 때 I :

  • 현재 시간을 변수에 넣으십시오.
  • 테스트 할 블록을 삽입하십시오.
  • 현재 시간을 변수에 넣고 이전 현재 시간 값을 뺍니다.

아주 간단한 과정이라서 정말이 질문을하신 건지 모르겠네요 ...


6

%L 루비에서 밀리 초를 제공합니다.

require 'time'
puts Time.now.strftime("%Y-%m-%dT%H:%M:%S.%L")

또는

puts Time.now.strftime("%Y-%m-%d %H:%M:%S.%L")

현재 타임 스탬프를 밀리 초 단위로 제공합니다.


이것은 경과 시간을 얻는 방법을 말하지 않습니다.
Robert

4

대답은 다음과 같습니다.

t_start = Time.now
# time-consuming operation
t_end = Time.now

milliseconds = (t_start - t_end) * 1000.0

그러나, 그 Time.now 접근 방식이 부정확 할 위험이 있습니다. Luca Guidi의 게시물을 찾았습니다.

https://blog.dnsimple.com/2018/03/elapsed-time-with-ruby-the-right-way/

시스템 시계는 지속적으로 부동하며 앞으로 만 이동하지 않습니다. 경과 시간 계산이이를 기반으로하는 경우 계산 오류 또는 중단이 발생할 가능성이 큽니다 .

따라서 Process.clock_gettime대신 사용 하는 것이 좋습니다 . 다음과 같은 것 :

def measure_time
  start_time = Process.clock_gettime(Process::CLOCK_MONOTONIC)
  yield
  end_time = Process.clock_gettime(Process::CLOCK_MONOTONIC)
  elapsed_time = end_time - start_time
  elapsed_time.round(3)
end

예:

elapsed = measure_time do
    # your time-consuming task here:
    sleep 2.2321
end

=> 2.232

3

두 번째에서 첫 번째 Time.now를 빼십시오. 이렇게 :

a = Time.now
sleep(3)
puts Time.now - a # about 3.0

이것은 두 시간 사이의 초의 부동 소수점 수를 제공합니다 (그리고 그와 함께 밀리 초).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.