Hiệu suất - Date.now () so với Date.getTime ()


113
var timeInMs = Date.now();

mỗi MDN

so với

var timeInMs = new Date(optional).getTime();

mỗi MDN .

Có sự khác biệt nào giữa hai điều này, ngoài cú pháp và khả năng đặt Ngày (không phải hiện tại) thông qua tùy chọn trong phiên bản thứ hai không?

Date.now () nhanh hơn - hãy xem jsperf


54
Đối với bất kỳ ai quan tâm, Date.now () không hoạt động trong các phiên bản Internet Explorer trước IE9. Bản thân tôi không quan tâm
Guido

8
Đối với giá trị của nó, bạn có thể thêm miếng đệm tương thích được đề cập trong developer.mozilla.org/en-US/docs/JavaScript/Reference/… để làm cho Date.now () hoạt động trên IE <9.
jrajav 20/09/12

Câu trả lời:


105

Những điều này đều giống nhau ( chỉnh sửa ngữ nghĩa; hiệu suất tốt hơn một chút với .now()):

var t1 = Date.now();
var t2 = new Date().getTime();

Tuy nhiên, giá trị thời gian từ bất kỳ cá thể đã được tạo nào Dateđều bị đóng băng tại thời điểm xây dựng (hoặc bất kỳ thời gian / ngày nào mà nó được đặt thành). Đó là, nếu bạn làm điều này:

var now = new Date();

và sau đó đợi một lúc, một cuộc gọi tiếp theo tới now.getTime()sẽ cho biết thời gian tại điểm biến được đặt.


Bạn có nghĩ rằng sẽ hiệu quả hơn nếu tạo một đối tượng ngày tháng trong phần khởi đầu của chương trình và sau đó chỉ cần cập nhật đối tượng ngày tháng đó ( dateObj.setTime(Date.now())) hoặc tạo đối tượng ngày tháng mới mỗi khi bạn làm điều gì đó không đồng bộ cần truy cập Datecác phương thức (chẳng hạn như dateObj.getMinutes())?
doubleOrt

3
Thời gian chạy JavaScript hiện đại của @Taurus cực kỳ tốt trong việc tạo đối tượng và thu thập rác. Trừ khi bạn đang làm việc trên một số loại hạt nhân trò chơi thời gian thực, không có lý do gì để lo lắng về điều đó. Viết mã trông đẹp và không dễ vỡ.
Pointy

1
không nên nói lời cảm ơn mà là cảm ơn (tôi hy vọng tôi chưa làm điều này nhiều hơn một lần).
doubleOrt

57

Chúng có hiệu quả tương đương, nhưng bạn nên sử dụng Date.now(). Nó rõ ràng hơn và nhanh gấp đôi.

Chỉnh sửa: Nguồn: http://jsperf.com/date-now-vs-new-date


1
Điều này Date(optional).getTime();có phải do phải phân bổ không gian để có được một đối tượng Ngày mới trước khi lấy thời gian hiện tại không?
Charlie G

Chắc là đúng. Tuy nhiên, tôi mong đợi rằng nó có liên quan nhiều hơn đến mọi thứ mà hàm tạo Ngày đang làm hơn là việc phân bổ thực tế của đối tượng.
jrajav 20/09/12

Vâng, tôi đã thêm điều đó một cách nhanh chóng - ý tôi là sự phân bổ và mọi thứ đi cùng với việc tạo một đối tượng.
Charlie G

4

Khi bạn làm, (new Date()).getTime()bạn đang tạo một đối tượng Ngày mới. Nếu bạn làm điều này nhiều lần, nó sẽ chậm hơn khoảng 2 lần so với Date.now ()

Nguyên tắc tương tự nên áp dụng cho Array.prototype.slice.call(arguments, 0)vs[].slice.call(arguments, 0)


3

Vâng, điều đó là chính xác; chúng có hiệu quả tương đương khi sử dụng thời gian hiện tại.


2

Đôi khi bạn nên giữ một số biến theo dõi thời gian ở định dạng đối tượng Ngày hơn là chỉ một số mili giây, để có quyền truy cập vào các phương thức của Ngày mà không cần khởi tạo lại. Trong trường hợp đó, Date.now () vẫn thắng Date () mới hoặc tương tự, mặc dù chỉ khoảng 20% ​​trên Chrome của tôi và một lượng nhỏ trên IE.

Xem JSPERF của tôi trên

timeStamp2.setTime(Date.now()); // set to current;

so với

timeStamp1 = new Date(); // set to current;

http://jsperf.com/new-date-vs-settime

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.