ประสิทธิภาพ - Date.now () เทียบกับ Date.getTime ()


113
var timeInMs = Date.now();

ต่อMDN

เทียบกับ

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

ต่อMDN .

มีความแตกต่างใด ๆ ระหว่างทั้งสองนอกเหนือจากไวยากรณ์และความสามารถในการตั้งค่าวันที่ (ไม่ใช่ปัจจุบัน) ผ่านทางเลือกในเวอร์ชันที่สองหรือไม่

Date.now () เร็วกว่า - ตรวจสอบjsperf


55
สำหรับใครก็ตามที่สนใจ Date.now () จะไม่ทำงานใน Internet Explorer เวอร์ชันก่อนหน้า IE9 ตัวฉันเองไม่สนใจ
guido

8
สำหรับสิ่งที่คุ้มค่าคุณสามารถเพิ่ม shim ความเข้ากันได้ที่กล่าวถึงในdeveloper.mozilla.org/en-US/docs/JavaScript/Reference/…เพื่อให้ Date.now () ทำงานบน IE <9 ได้เช่นกัน
jrajav

คำตอบ:


105

สิ่งเหล่านี้เหมือนกัน ( แก้ไขความหมายประสิทธิภาพดีขึ้นเล็กน้อยด้วย.now()):

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

อย่างไรก็ตามค่าเวลาจากDateอินสแตนซ์ที่สร้างไว้แล้วจะถูกตรึงในขณะที่สร้าง (หรือเมื่อใดก็ตามที่ตั้งค่าเป็นวันที่) นั่นคือถ้าคุณทำสิ่งนี้:

var now = new Date();

จากนั้นรอสักครู่สายที่ตามมาnow.getTime()จะบอกเวลา ณ จุดที่กำหนดตัวแปร


คุณคิดว่าจะมีประสิทธิภาพมากกว่าในการสร้างวัตถุวันที่หนึ่งในการเริ่มต้นของโปรแกรมจากนั้นเพียงอัปเดตออบเจ็กต์วันที่นั้น ( dateObj.setTime(Date.now())) หรือสร้างวัตถุวันที่ใหม่ทุกครั้งที่คุณทำบางอย่างแบบอะซิงโครนัสที่ต้องเข้าถึงDateเมธอด (เช่นdateObj.getMinutes())
doubleOrt

3
@Taurus runtimes JavaScript สมัยใหม่นั้นดีมากในการสร้างวัตถุและการเก็บขยะ หากคุณไม่ได้ทำงานกับเคอร์เนลเกมแบบเรียลไทม์ก็ไม่มีเหตุผลที่จะต้องกังวล เขียนโค้ดที่ดูดีและไม่เปราะบาง
Pointy

1
ไม่ควรกล่าวขอบคุณ แต่ขอบคุณ (ฉันหวังว่าฉันจะไม่ได้ทำสิ่งนี้มากกว่าหนึ่งครั้ง)
doubleOrt

57

พวกเขาจะเทียบเท่าได้อย่างมีประสิทธิภาพ Date.now()แต่คุณควรใช้ ชัดเจนกว่าและเร็วกว่าประมาณสองเท่า

แก้ไข: ที่มา: http://jsperf.com/date-now-vs-new-date


1
เป็นเพราะDate(optional).getTime();ต้องจัดสรรพื้นที่เพื่อรับวัตถุ Date ใหม่ก่อนจึงจะได้เวลาปัจจุบันหรือไม่?
Charlie G

อาจจะใช่. ฉันคาดหวังว่าจะมีส่วนเกี่ยวข้องกับทุกสิ่งที่ตัวสร้างวันที่กำลังทำมากกว่าการจัดสรรวัตถุจริง
jrajav

ใช่ฉันเพิ่มสิ่งนั้นลงไป - ฉันหมายถึงการจัดสรรและทุกอย่างที่ไปพร้อมกับการสร้างวัตถุ
Charlie G

4

เมื่อคุณ(new Date()).getTime()กำลังสร้างวัตถุ Date ใหม่ หากคุณทำสิ่งนี้ซ้ำ ๆ จะช้ากว่า Date.now () ประมาณ 2 เท่า

ควรใช้หลักการเดียวกันArray.prototype.slice.call(arguments, 0)กับ vs[].slice.call(arguments, 0)



2

บางครั้งควรเก็บตัวแปรการติดตามเวลาไว้ในรูปแบบวัตถุวันที่แทนที่จะเป็นเพียงเสี้ยววินาทีเพื่อให้สามารถเข้าถึงเมธอดของ Date ได้โดยไม่ต้องสร้างอินสแตนซ์ใหม่ ในกรณีนั้น Date.now () ยังคงชนะ Date () ใหม่หรือสิ่งที่คล้ายกันแม้ว่าจะมีเพียงประมาณ 20% บน Chrome ของฉันและเพียงเล็กน้อยใน IE

ดู JSPERF ของฉันบน

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

เทียบกับ

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

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.