• 有趣简单的M2处理器性能实验:Swift与C代码执行速度的比较


    概述

    Apple老是吹嘘自己的Swift语言有多么快,到底真相如何呢?大家可能都没有一个感性的认识。

    在Mac上运行Swift与C语言编写的代码到底哪个更快呢?肯定很多小伙伴都会认为是C更快,如果真的如此,差距又有多少呢?

    在Intel和M系列结构上,Swift与C语言比较又有什么质的差别呢?

    在本篇,我们将用一个可能不太精确,但十分简单的例子来验证一下上面的Swift与C语言“快慢”之争。

    让我们拭目以待吧!😉

    测试代码

    注意,本篇博文并不是一个在大多数环境或通用意义上代码用例的精确测试,如果大家希望这种测试,可以用专业的cpu性能测试工具来完成。

    这里,我们仅用寥寥几行代码,给大家一个初步的感性体验,让小伙伴们感受到Mac的性感之处。 😃

    首先,是C语言的测试代码:

    #include <stdio.h>
    #include <sys/time.h>
    
    int main() {
        printf("Mac性能测试演示\n");
        
        struct timeval tv;
        
        for (int i = 0; i < 1000; i++) {
            gettimeofday(&tv, NULL);
            printf("[%d]: %ld.%d \n", i, tv.tv_sec, tv.tv_usec);
        }
        
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    注意,我们不能使用诸如ftime()、clock()之类的函数,因为它们精度不够。

    这里,使用gettimeofday()函数,可以达到微秒级别的精度,可以基本满足我们目前的需求。

    接着,是Swift语言的测试代码,就更简单了:

    for i in 0..<1000 {
        print("[\(i)]: \(Date.timeIntervalSinceReferenceDate)")
    }
    
    • 1
    • 2
    • 3

    无论是C或Swift的测试代码,我们意图都是计算单次整数递增所花费的粗略时间。

    再次申明:此计算比较不具有通用意义,不过很好玩很简单,略可管中窥豹而已。

    喜欢较真的童鞋就别和我较真啦 😉

    Intel架构

    我们首先来看Intel架构C语言的表现:

    在这里插入图片描述

    若我们只取最快的间隔周期,则可以看到最快只需2微秒左右。

    再来看Swift的表现:

    在这里插入图片描述

    可以看到Swift代码最快可达到25微秒左右。

    M2

    现在,来测试一下M2处理器的表现,同样首先是C代码的执行结果:

    在这里插入图片描述

    可以看到,M2中C代码执行结果中,最短间隔达到了1微秒,和Intel CPU差距并不多。

    最后,来看一下M2中Swift的表现:

    在这里插入图片描述

    Swift在M2的执行速度相当给力,最短间隔仅为3微秒左右,几乎达到Intel中C语言的速度。

    所以,如果想充分榨干系统性能,还得靠底层的C语言;不过大多数情况下Swift还是能够满足性能要求的,更何况M2处理器上Swift有了更多加分的理由。

    总结

    本篇博文,我们一起在M2和Intel架构中,实验了C和Swift语言执行效率上非常简单的有趣比较。

    下次有机会,可以加入汇编语言再试一下,不过那样的话微秒级别估计会不够用哦。😎

    感谢小伙伴们一起参与这个实验小游戏,谢谢观赏,再会!

  • 相关阅读:
    [go 面试] 接口测试的方法与技巧
    博客目录导读
    C# 使用SIMD向量类型加速浮点数组求和运算(1):使用Vector4、Vector<T>
    华为设备SSH远程访问配置实验简述
    快速解决mfc140u.dll丢失问题,找不到mfc140u.dll修复方法分享
    Python基础入门篇【18】--python中的流程控制之条件判断
    简易实现通讯录(1.0)
    Google Earth Engine 教程——如何建立新的影像投影后将其每个矢量格网转化为栅格?
    Windows下的Hadoop(个人附加,有需要的看看,当个参考)
    Docker中搭建Elasticsearch+Kibana
  • 原文地址:https://blog.csdn.net/mydo/article/details/126120915