Java中计时函数

Java计时函数currentTimeMills()

  System.currentTimeMills()计时精确到毫秒级,跟计算机以1970年1月1日0时为计时起点一样,该函数方法统计的也是从1970年1月1日0时开始,到程序运行到该函数时刻的毫秒总数。
  该函数方法定义在Java系统类System中,如果想实现程序运行计时功能也很简单,只要在程序前后分别放置该函数方法,然后后减前毫秒总数,就能计算程序运行的耗时。具体实现如下:

long startTime = System.currentTimeMills(); //程序开始记录时间
//。。。 。。。
long endTime   = System.currentTimeMills(); //程序结束记录时间
long TotalTime = endTime - startTime;       //总消耗时间

个人学习记录,由于能力和时间有限,如果有错误望读者纠正,谢谢!

转载请注明出处:优快云 无鞋童鞋。

<think>好的,用户想了解JavaScript中的计时函数及其使用方法,特别是setInterval和setTimeout。首先,我需要确认用户的需求,他们可能是在开发网页时需要定时执行某些操作,比如轮询数据、动画效果或者延迟执行任务。根据提供的引用内容,用户已经给出了一些关于setTimeout和setInterval的示例代码和解释。我需要将这些信息整合起来,以清晰的结构呈现。首先,应该介绍这两个函数的基本用法,然后讨论它们的区别,接着是注意事项,比如清除定时器和避免内存泄漏。用户提供的引用中提到了宏任务和微任务的区别,这可能涉及到事件循环的知识,但用户的问题可能更基础,所以需要适当提及但不过于深入。另外,用户提到了防抖和节流,这些是常见的高级应用技巧,应该包含在高级应用部分。需要注意的是,用户可能对如何正确使用这些函数以及常见的陷阱感兴趣,比如定时器不准的问题,或者忘记清除定时器导致的内存泄漏。同时,用户提供的示例代码中有使用HTML按钮控制定时器的例子,这可以作为实践示例来展示如何结合DOM操作使用计时函数。 需要确保回答结构清晰,分点说明,并包含代码示例。同时,按照用户的系统指令,数学公式要用正确的LaTeX格式,但在这个问题中可能涉及较少。最后生成相关问题,帮助用户深入理解。现在开始组织内容:先定义两个函数,基本语法,使用示例,区别对比,注意事项,高级技巧,最后实践案例。确保每个部分都有引用支持,并正确标注引用来源。检查是否有遗漏点,比如清除定时器的方法,以及事件循环的影响。</think>### JavaScript计时函数详解与使用指南 JavaScript 提供了两个核心计时函数 `setTimeout`` 和 `setInterval``,它们通过事件循环机制实现异步定时操作[^1][^3]。以下是详细解析: --- #### **一、基础计时函数** 1. **`setTimeout`:单次延时执行** ```javascript // 语法:setTimeout(callback, delay, arg1, arg2...) const timerId = setTimeout(() => { console.log('延时1秒后执行'); }, 1000); // 清除定时器 clearTimeout(timerId); ``` - 延迟时间单位为毫秒(ms) - 支持传递参数给回调函数:`setTimeout((a,b) => {}, 1000, 1, 2)` 2. **`setInterval`:周期性重复执行** ```javascript // 语法:setInterval(callback, interval, arg1, arg2...) const intervalId = setInterval(() => { console.log('每隔2秒执行一次'); }, 2000); // 清除定时器 clearInterval(intervalId); ``` --- #### **二、核心区别对比** | 特性 | `setTimeout` | `setInterval` | |--------------------|----------------------------------|---------------------------------| | **执行次数** | 单次执行 | 无限循环直到清除 | | **误差累积** | 无累积误差(单次触发) | 可能因代码执行时间产生累积误差 | | **内存泄漏风险** | 较低 | 较高(需手动清除) | | **适用场景** | 延迟操作、单次动画 | 轮询、周期性更新 | --- #### **三、关键注意事项** 1. **事件循环机制** 计时器回调属于**宏任务(macrotask)**,会在当前执行栈清空后执行[^1]: ```javascript console.log('Start'); setTimeout(() => console.log('Timeout'), 0); Promise.resolve().then(() => console.log('Promise')); console.log('End'); // 输出顺序:Start → End → Promise → Timeout ``` 2. **定时器精度问题** JavaScript计时器最小间隔为$4ms$(浏览器规范限制),且受主线程阻塞影响: ```javascript let start = Date.now(); setTimeout(() => { console.log(`实际延迟: ${Date.now() - start}ms`); // 可能大于1000ms }, 1000); ``` 3. **内存管理** 未清除的定时器会导致内存泄漏,应在组件卸载时清除: ```javascript let intervalId; function startPolling() { intervalId = setInterval(fetchData, 5000); } function stopPolling() { clearInterval(intervalId); } ``` --- #### **四、高级应用技巧** 1. **用`setTimeout`模拟`setInterval`** 避免误差累积的更可控实现[^1]: ```javascript function customInterval(callback, interval) { let timer; function execute() { callback(); timer = setTimeout(execute, interval); // 递归调用 } timer = setTimeout(execute, interval); return { clear: () => clearTimeout(timer) }; } ``` 2. **防抖(debounce)与节流(throttle)** - **防抖**:连续触发时只执行最后一次 ```javascript function debounce(fn, delay) { let timer; return (...args) => { clearTimeout(timer); timer = setTimeout(() => fn(...args), delay); }; } ``` - **节流**:固定间隔内只执行一次 ```javascript function throttle(fn, interval) { let lastTime = 0; return (...args) => { const now = Date.now(); if (now - lastTime >= interval) { fn(...args); lastTime = now; } }; } ``` --- #### **五、实践案例** ```html <!DOCTYPE html> <html> <body> <button onclick="startCounter()">开始计数</button> <span id="count">0</span> <button onclick="stopCounter()">停止</button> <script> let counter = 0; let timerId; function startCounter() { timerId = setInterval(() => { counter++; document.getElementById('count').textContent = counter; }, 1000); } function stopCounter() { clearInterval(timerId); } </script> </body> </html> ``` --- ###
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值