• 实验:结合多种编程语言,验证频繁调用函数是否会造成系统性能损失


    实验背景:

    1、前一段时间,在与老师共同开发的过程中,老师提出了少用函数,函数会造成所开发系统的性能的损失。对于这一点,我是赞同的,但同时觉得造成的系统性能的损失应该也是很微下的。因此,有了本次的实验。

    2、本次实验将会从java、C++、python、浏览器运行js脚本和jvm中运行js脚本,四种如今流行的编程语言,五种方式。来比对对一个数做10亿次加法,使用函数和不使用函数的时间差异。由于本次为实验,为了方便阐述实验结果,因此,实验的代码和截图部分同一放在博客的后半部分。

    1、java语言性能比较

    由实验数据可以得出:在十亿次对一个数自增操作下,使用函数的确会降低系统的性能,但是影响并不是很大,因此用java语言在实际开发中并不是很需要关心定义函数会明显的影响系统性能。

    2、C++语言性能比较

    由实验数据可得:在C++中,使用函数会比不使用函数进行调用效率高,并且使用内联函数的确能够少幅度的提升系统性能。至于为什么以速度见称的C++语言在执行10亿次自增操作还需2s钟以上的时间就不清楚了。

    3、python语言性能比较(由于实验过程中python语言的执行效率太低了,因此实验的循环次数为1亿,节约等待的时间)

    由实验数据可得:在python语言中。不使用函数比使用函数在执行速度上有着显著的区别,因此在python语言进行开发时,应尽量减少函数的使用。同时,如果开发对系统性能有较高要求的软件,使用python语言可能并不是一种明智的选择。

    4、js代码在浏览器中运行的性能比较

    由实验数据可得:js代码在浏览器中执行10亿次自增操作速度还相对较快,虽然频繁的使用函数会有少许的性能影响,但是影响并不大。

    5、js脚本在java虚拟机中运行的性能比较

    由实验数据可得:js脚本在jvm中运行,使用函数比不使用函数还是有着一定的性能差距。同时。js代码在jvm中的运行普遍较慢,因此在java开发中要慎重的使用js脚本。

    6、总结:

    在本次的实验中:各语言的执行效率 java > js在浏览器中执行 > C++ > js在jvm中执行 > python

    同时,频繁的使用函数的确会造成少许的执行效率的损失,但是对于大多数语言(python除外),其速度差异并不是很明显,因此在开发中要根据不同编程语言的特点进行合理的使用。

    下面将会贴出本次实验各个语言的实验代码和首次运行的实验截图

    7、java

    package com.xgp.company;
    
    public class Main {
    
        private static int count = 0;
    
        public static void main(String[] args) {
    
            long start = System.currentTimeMillis();
    //        System.out.println(start);
            for(int i = 0;i <= 999999999;i++) {
                count++;
            }
            long end = System.currentTimeMillis();
    
            System.out.println("未使用函数自增10 0000 0000次的时间:" + (end - start) + "ms");
    
            count = 0;
            System.out.println("==========================");
    
            start = System.currentTimeMillis();
            for(int i = 0;i <= 999999999;i++) {
                method();
            }
            end = System.currentTimeMillis();
            System.out.println("使用函数完成10 0000 0000次自增的时间:" + (end - start) + "ms");
    
        }
    
        private static void method() {
            count++;
        }
    }
    

    8、C++

    #include <iostream>
    #include <windows.h>
    
    using namespace std;
    
    int count = 0;
    void method();
    inline void fun();
    
    int main() {
        SYSTEMTIME st = { 0 };
        GetLocalTime(&st);
        long start = st.wHour*60*60*1000 + st.wMinute*60*1000 + st.wSecond*1000 + st.wMilliseconds;
    
        for(int i = 0;i <= 999999999;i++) {
            count++;
        }
    
        GetLocalTime(&st);
        long end = st.wHour*60*60*1000 + st.wMinute*60*1000 + st.wSecond*1000 + st.wMilliseconds;
    
        cout<<"未使用函数自增10 0000 0000次的时间:"<<end-start<<"ms"<<endl;
    
        count = 0;
    
        cout<<"=============================="<<endl;
    
        GetLocalTime(&st);
        start = st.wHour*60*60*1000 + st.wMinute*60*1000 + st.wSecond*1000 + st.wMilliseconds;
        for(int i = 0;i <= 999999999;i++) {
            method();
        }
        GetLocalTime(&st);
        end = st.wHour*60*60*1000 + st.wMinute*60*1000 + st.wSecond*1000 + st.wMilliseconds;
    
        cout<<"使用函数完成10 0000 0000次自增的时间:"<<end-start<<"ms"<<endl;
    
    
        count = 0;
    
        cout<<"=============================="<<endl;
    
        GetLocalTime(&st);
        start = st.wHour*60*60*1000 + st.wMinute*60*1000 + st.wSecond*1000 + st.wMilliseconds;
        for(int i = 0;i <= 999999999;i++) {
            fun();
        }
        GetLocalTime(&st);
        end = st.wHour*60*60*1000 + st.wMinute*60*1000 + st.wSecond*1000 + st.wMilliseconds;
    
        cout<<"使用内联函数完成10 0000 0000次自增的时间:"<<end-start<<"ms"<<endl;
    
        return 0;
    }
    
    void method() {
        count++;
    }
    
    inline void fun() {
        count++;
    }
    

    9、python

    import time
    
    count = 0
    
    t = time.time()
    start = int(round(t * 1000))
    
    for i in range(99999999):
        count += 1
    
    t = time.time()
    end = int(round(t * 1000))
    
    print("未使用函数自增1 0000 0000次的时间:",end-start,"ms")
    
    count = 0
    print("===============================================")
    
    def method():
        global count
        count += 1
    
    t = time.time()
    start = int(round(t * 1000))
    
    for i in range(99999999):
        method()
    
    t = time.time()
    end = int(round(t * 1000))
    
    print("使用函数完成1 0000 0000次自增的时间:",end-start,"ms")
    

    10、js在浏览器中运行的代码

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>Document</title>
    </head>
    
    <body>
        <script>
            var count = 0;
    
            let start = new Date().getTime();
            for(var i = 0;i <= 999999999;i++) {
                count++;
            }
            let end = new Date().getTime();
    
            console.log("未使用函数自增10 0000 0000次的时间:" + (end -start) + "ms");
    
            count = 0;
            console.log("================================================")
    
            start = new Date().getTime();
            for(var i = 0;i <= 999999999;i++) {
                method();
            }
            end = new Date().getTime();
    
            console.log("使用函数完成10 0000 0000次自增的时间:" + (end -start) + "ms");
    
            function method() {
                count++;
            }
        </script>
    </body>
    
    </html>
    

    11、js脚本在jvm中运行的代码

    var count = 0;
    
    var start = new Date().getTime();
    for(var i = 0;i <= 999999999;i++) {
        count++;
    }
    var end = new Date().getTime();
    
    print("未使用函数自增10 0000 0000次的时间:" + (end -start) + "ms");
    
    count = 0;
    print("================================================")
    
    start = new Date().getTime();
    for(var i = 0;i <= 999999999;i++) {
        method();
    }
    end = new Date().getTime();
    
    print("使用函数完成10 0000 0000次自增的时间:" + (end -start) + "ms");
    
    function method() {
        count++;
    }
    

  • 相关阅读:
    py二级习题
    js 闪烁的文字
    用windows 画图 裁剪照片
    JS 练习
    弧度制与角度制
    Knockout.Js官网学习(event绑定、submit绑定)
    js中进行金额计算 parseFloat 会产生精度问题,toFixed(2) 方法修正
    JQuery通过类选择器捕获click事件获取bai当前点击对象的id, javascript中onclick(this)用法介绍
    jQuery检查元素是否含有指定的class类,使用.hasClass()方法
    ajax的dataType有哪些类型?
  • 原文地址:https://www.cnblogs.com/xgp123/p/12284965.html
Copyright © 2020-2023  润新知