不同编程语言如何统计代码执行时间

news2024/9/21 23:24:29

在这里插入图片描述

在软件开发过程中,统计代码执行时间是一个非常有用的工具,可以帮助开发者优化程序性能、识别瓶颈以及进行基准测试。不同的编程语言提供了不同的方法来测量代码执行时间。以下是一些常见编程语言中测量代码执行时间的方法,并详细解释每一步的重点步骤。

一、基本概念

在开始之前,我们需要了解几个基本概念:

  • CPU时间:指的是CPU执行代码所花费的时间。这通常分为用户时间和系统时间。
    • 用户时间:程序直接执行指令所花费的时间。
    • 系统时间:程序因系统调用而使操作系统内核执行指令所花费的时间。
  • 墙钟时间:指的是从代码开始执行到结束的实际时间,通常包含了所有的等待时间(如I/O等待)。
二、C/C++

在C/C++中,可以使用<time.h>库中的clock()函数来测量用户时间和系统时间,或者使用<sys/time.h>库中的gettimeofday()函数来测量墙钟时间。

示例代码:
#include <stdio.h>
#include <time.h>
#include <unistd.h>

int main() {
    clock_t start, end;
    double cpu_time_used;

    start = clock(); // 1. 开始计时
    // 1. 解释:clock() 函数记录的是程序启动以来消耗的 CPU 时间(以 ticks 计),CLOCKS_PER_SEC 定义了每秒的 ticks 数。

    // 执行你的代码
    for (int i = 0; i < 100000000; ++i) {
        // 假设这是一个计算密集型的操作
    }

    end = clock(); // 2. 结束计时
    // 2. 解释:再次调用 clock() 函数,得到结束时刻的 CPU 时间。

    cpu_time_used = ((double) (end - start)) / CLOCKS_PER_SEC;
    // 3. 计算 CPU 时间差
    // 3. 解释:计算两次调用 clock() 函数之间的时间差,并转换成秒。

    printf("CPU time used: %f\n", cpu_time_used);

    return 0;
}
使用gettimeofday()
#include <stdio.h>
#include <sys/time.h>
#include <unistd.h>

int main() {
    struct timeval start, end;
    double elapsed;

    gettimeofday(&start, NULL); // 1. 开始计时
    // 1. 解释:gettimeofday() 函数记录的是从 UNIX 纪元开始到现在的实际时间(以秒和微秒计)。

    // 执行你的代码
    for (int i = 0; i < 100000000; ++i) {
        // 假设这是一个计算密集型的操作
    }

    gettimeofday(&end, NULL); // 2. 结束计时
    // 2. 解释:再次调用 gettimeofday() 函数,得到结束时刻的时间。

    elapsed = (end.tv_sec - start.tv_sec) + (end.tv_usec - start.tv_usec) / 1000000.0;
    // 3. 计算时间差
    // 3. 解释:计算两次调用 gettimeofday() 函数之间的时间差,并转换成秒。

    printf("Elapsed time: %f\n", elapsed);

    return 0;
}
三、Python

在Python中,可以使用内置的time模块来测量代码执行时间。

示例代码:
import time

start_time = time.time()  # 1. 开始计时
# 1. 解释:time.time() 函数记录的是从 UNIX 纪元开始到现在的实际时间(以秒计)。

# 执行你的代码
for i in range(100000000):
    pass  # 假设这是一个计算密集型的操作

elapsed_time = time.time() - start_time  # 2. 结束计时
# 2. 解释:再次调用 time.time() 函数,得到结束时刻的时间,并计算时间差。

print(f"Elapsed time: {elapsed_time:.6f} seconds")
# 3. 输出时间差
# 3. 解释:输出两次调用 time.time() 函数之间的时间差。
四、Java

在Java中,可以使用System.currentTimeMillis()来测量墙钟时间,或者使用System.nanoTime()来测量更精确的时间。

示例代码:
public class Main {
    public static void main(String[] args) {
        long startTime = System.currentTimeMillis(); // 1. 开始计时
        // 1. 解释:System.currentTimeMillis() 方法记录的是从 UNIX 纪元开始到现在的实际时间(以毫秒计)。

        // 执行你的代码
        for (int i = 0; i < 100000000; ++i) {
            // 假设这是一个计算密集型的操作
        }

        long endTime = System.currentTimeMillis(); // 2. 结束计时
        // 2. 解释:再次调用 System.currentTimeMillis() 方法,得到结束时刻的时间。

        long elapsedTime = endTime - startTime;
        // 3. 计算时间差
        // 3. 解释:计算两次调用 System.currentTimeMillis() 方法之间的时间差,并转换成毫秒。

        System.out.println("Elapsed time: " + elapsedTime + " milliseconds");
    }
}
使用System.nanoTime()
public class Main {
    public static void main(String[] args) {
        long startTime = System.nanoTime(); // 1. 开始计时
        // 1. 解释:System.nanoTime() 方法记录的是从某个固定点开始到现在的实际时间(以纳秒计)。

        // 执行你的代码
        for (int i = 0; i < 100000000; ++i) {
            // 假设这是一个计算密集型的操作
        }

        long endTime = System.nanoTime(); // 2. 结束计时
        // 2. 解释:再次调用 System.nanoTime() 方法,得到结束时刻的时间。

        long elapsedTime = endTime - startTime;
        // 3. 计算时间差
        // 3. 解释:计算两次调用 System.nanoTime() 方法之间的时间差,并转换成纳秒。

        System.out.println("Elapsed time: " + elapsedTime + " nanoseconds");
    }
}
五、JavaScript

在Web前端开发中,可以使用Date.now()来测量代码执行时间。

示例代码:
console.time('Execution Time'); // 1. 开始计时
// 1. 解释:console.time() 方法记录的是从调用开始到 console.timeEnd() 调用之间的时间(以毫秒计)。

// 执行你的代码
for (let i = 0; i < 100000000; ++i) {
    // 假设这是一个计算密集型的操作
}

console.timeEnd('Execution Time'); // 2. 结束计时
// 2. 解释:再次调用 console.timeEnd() 方法,结束计时,并输出时间差。
六、Go

在Go语言中,可以使用time包中的Now()Sub()方法来测量代码执行时间。

示例代码:
package main

import (
    "fmt"
    "time"
)

func main() {
    startTime := time.Now() // 1. 开始计时
    // 1. 解释:time.Now() 方法记录的是从 UNIX 纪元开始到现在的实际时间(以纳秒计)。

    // 执行你的代码
    for i := 0; i < 100000000; i++ {
        // 假设这是一个计算密集型的操作
    }

    elapsed := time.Since(startTime) // 2. 结束计时
    // 2. 解释:time.Since() 方法计算从 startTime 到现在的时间差(以纳秒计)。

    fmt.Printf("Elapsed time: %s\n", elapsed)
    // 3. 输出时间差
    // 3. 解释:输出两次调用 time.Now() 之间的时间差。
}
七、总结

通过上述示例,你可以看到不同编程语言提供了多种方法来测量代码执行时间。选择哪种方法取决于具体的需求,比如是否需要高精度的测量结果、是否需要考虑CPU时间还是墙钟时间等。在实际应用中,根据具体情况选择合适的方法来统计代码执行时间,可以帮助开发者更好地优化程序性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2141698.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

I2C/IIC学习笔记

I2C/IIC 有些同学I2C和IIC分不清&#xff0c;I2C和IIC实际上是指同一种通信协议。I2C是Inter-Integrated Circuit的缩写&#xff0c;而IIC是它的另一种表述方式&#xff0c;代表的是同一个意思&#xff0c;即“集成电路间总线”。I2C是一种由飞利浦公司&#xff08;现恩智浦半…

数据结构(7.3_2)——平衡二叉树

平衡二叉树&#xff0c;简称平衡树(AVL树)----树上任一结点的左子树和右子树的高度之差不超过1. 结点的平衡因子左子树高-右子树高 //平衡二叉树结点 typedef struct AVLNode {int key;//数据域int blalance;//平衡因子struct AVLNode* lchild, * rchild; }AVLNode,*AVLTree; …

中秋:明月寄相思,灯笼映团圆

文章目录 前言项目概述实现步骤创建基础 HTML 结构添加动态背景和月亮创建 SVG 灯笼实现动态动画效果闪烁的星星效果调整灯笼和月亮尺寸 完整代码结语 前言 今天是中秋&#xff0c;这里先祝大家节日快乐&#xff01;&#x1f386;&#x1f386;&#x1f386; 在这篇博客中&…

ChatGPT有三个快捷指令和三个模式,你知道吗?

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;专注于分享AI全维度知识&#xff0c;包括但不限于AI科普&#xff0c;AI工…

xtu oj 折纸

折纸# 题目描述# 一个长为a,宽为b矩形的纸&#xff0c;我们沿b边(左边)的中点与右上顶点的边折叠&#xff0c;求左上顶点在折叠以后离下边的距离&#xff1f; 输入# 第一行是一个整数T(1≤T≤10000),表示样例的个数。 以后每行一个样例&#xff0c;为两个整数1≤a,b≤1000。…

​FullCalendar:强大的JavaScript事件日历

​FullCalendar&#xff1a;强大的JavaScript事件日历 如果你想让项目的日历功能像你周末一样灵活又强大&#xff0c;那么 FullCalendar 就是你的不二选择&#xff01;本文将带你了解这款高效的 JavaScript 日历库的亮点与使用方式。 软件简介 FullCalendar 是一个用 JavaScri…

PMP--一模--解题--101-110

文章目录 11.风险管理--过程--识别风险→实施定性风险分析→实施定量风险分析→规划风险应对→实施风险应对→监督风险101、 [单选] 在项目即将进入收尾阶段时&#xff0c;项目经理发现了一项原来没有考虑到的新风险。该风险一旦发生&#xff0c;可能给最终的可交付成果带来重要…

CSS——网格布局(display: grid)之上篇

CSS——网格布局&#xff08;display: grid&#xff09; 前面介绍了弹性布局&#xff0c;今天我们介绍一下网格布局。 什么是网格布局 CSS网格布局&#xff08;CSS Grid Layout&#xff09;是一种用于创建复杂网页布局的系统&#xff0c;它允许开发者以二维系统&#xff08;…

【C++学习】 IO 流揭秘:高效数据读写的最佳实践

✨ 今朝有酒今朝醉&#xff0c;明日愁来明日愁 &#x1f30f; &#x1f4c3;个人主页&#xff1a;island1314 &#x1f525;个人专栏&#xff1a;C学习 ⛺️ 欢迎关注&#xff1a;&#x1f44d;点赞 &#x1f442;&#x1f3f…

Docker部署ddns-go教程(包含完整的配置过程)

本章教程教程,主要介绍如何用Docker部署ddns-go。 一、拉取容器 docker pull jeessy/ddns-go:v6.7.0二、运行容器 docker run -d \--name ddns-go \--restart unless-stopped \

蓝桥杯—STM32G431RBT6按键的多方式使用(包含软件消抖方法精讲)从原理层面到实际应用(一)

新建工程教程见http://t.csdnimg.cn/JySLg 点亮LED教程见http://t.csdnimg.cn/Urlj5 末尾含所有代码 目录 按键原理图 一、按键使用需要解决的问题 1.抖动 1.什么是抖动 2.抖动类型 3.如何去消除抖动 FIRST.延时函数消抖&#xff08;缺点&#xff1a;浪费CPU资源&#xff…

1.使用 IDEA 过程中的英语积累 - File 菜单(每一次重点积累 5 个单词)

前言 学习可以不局限于传统的书籍和课堂&#xff0c;各种生活的元素也都可以做为我们的学习对象&#xff0c;本文将利用 IDEA 页面上的各种英文元素来做英语的积累&#xff0c;如此做有 3 大利 这些软件在我们工作中是时时刻刻接触的&#xff0c;借此做英语积累再合适不过&…

web开发 之 HTML、CSS、JavaScript、以及JavaScript的高级框架Vue(学习版2)

一、前言 接下来就是来解决这些问题 二、 Ajax 1.ajax javscript是网页三剑客之一&#xff0c;空用来控制网页的行为的 xml是一种标记语言&#xff0c;是用来存储数据的 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-…

Fastjson反序列化漏洞——JNDI注入

一.前言 之前使用反序列化和序列化时写入的到文件里面的&#xff0c;真实环境中&#xff0c;也是这样吗&#xff1f; 当然不是了&#xff0c;通过二进制&#xff0c;字节流数据进行的。 为什么会有JNDI&#xff1f; 由于http和ftp传输消耗资源仍然很大&#xff0c;就有了JRM…

macOS Sequoia发布:Apple又给我们带来了什么惊喜?

今天是个激动人心的日子,尤其是对于Mac用户来说,因为Apple正式发布了全新的操作系统——macOS Sequoia。作为一款专为Mac设备设计的操作系统,Sequoia不仅仅是简单的升级,它承载了Apple在系统体验上的巨大飞跃。听到这个消息,你可能会好奇,Apple这次又会带来什么样的创新?…

【Python】高效图像处理库:pyvips

月亮慢慢变圆&#xff0c;日子慢慢变甜。 在图像处理领域&#xff0c;pyvips 是一个轻量级且高效的库&#xff0c;适合处理大规模图像、实现高性能的操作。相较于其他常见的图像处理库如 PIL 或 OpenCV&#xff0c;pyvips 以其低内存占用和出色的速度脱颖而出。本文将介绍 pyv…

2024年全国大学生数学建模竞赛B题生产过程中的决策问题分析

目录 引言 问题 1&#xff1a;抽样检测方案设计 问题 2&#xff1a;生产过程中的决策 决策阶段划分 决策方案 结果 问题 3&#xff1a;多道工序和零配件的决策 生产流程 决策过程 问题 4&#xff1a;基于抽样检测的重新决策 动态调整次品率 结论 引言 在2024年全国…

[Golang] Sync

[Golang] Sync 文章目录 [Golang] Syncsync.WaitGroupsync.Once对比init() sync.Lock互斥锁和读写锁互斥锁读写锁 死锁问题加锁解锁不成对循环等待 sync.Mapsync/atomicatomic和mutex的区别atomic.value sync.Pool如何使用sync.Pool使用场景 Golang中我们一般提倡使用通信来共享…

Java入门,初识Java

Java背景知识 Java是早期美国 sun 公司&#xff08;Stanford University Network&#xff09;在1995年推出的一门计算机高级编程语言。Java早期称为Oak&#xff08;中文翻译为&#xff1a;橡树&#xff09;&#xff0c;后期改名为Java。&#xff08;因为当时sun公司门口有很多…

MySQL_数据类型简介

课 程 推 荐我 的 个 人 主 页&#xff1a;&#x1f449;&#x1f449; 失心疯的个人主页 &#x1f448;&#x1f448;入 门 教 程 推 荐 &#xff1a;&#x1f449;&#x1f449; Python零基础入门教程合集 &#x1f448;&#x1f448;虚 拟 环 境 搭 建 &#xff1a;&#x1…