實驗:結合多種編程語言,驗證頻繁調用函數是否會形成系統性能損失

實驗背景:

一、前一段時間,在與老師共同開發的過程當中,老師提出了少用函數,函數會形成所開發系統的性能的損失。對於這一點,我是贊同的,但同時以爲形成的系統性能的損失應該也是很微下的。所以,有了本次的實驗。

二、本次實驗將會從java、C++、python、瀏覽器運行js腳本和jvm中運行js腳本,四種現在流行的編程語言,五種方式。來比對對一個數作10億次加法,使用函數和不使用函數的時間差別。因爲本次爲實驗,爲了方便闡述實驗結果,所以,實驗的代碼和截圖部分同一放在博客的後半部分。

一、java語言性能比較

由實驗數據能夠得出:在十億次對一個數自增操做下,使用函數的確會下降系統的性能,可是影響並非很大,所以用java語言在實際開發中並非很須要關心定義函數會明顯的影響系統性能。

二、C++語言性能比較

由實驗數據可得:在C++中,使用函數會比不使用函數進行調用效率高,而且使用內聯函數的確可以少幅度的提高系統性能。至於爲何以速度見稱的C++語言在執行10億次自增操做還需2s鍾以上的時間就不清楚了。

三、python語言性能比較(因爲實驗過程當中python語言的執行效率過低了,所以實驗的循環次數爲1億,節約等待的時間)

由實驗數據可得:在python語言中。不使用函數比使用函數在執行速度上有着顯著的區別,所以在python語言進行開發時,應儘可能減小函數的使用。同時,若是開發對系統性能有較高要求的軟件,使用python語言可能並非一種明智的選擇。

四、js代碼在瀏覽器中運行的性能比較

由實驗數據可得:js代碼在瀏覽器中執行10億次自增操做速度還相對較快,雖然頻繁的使用函數會有少量的性能影響,可是影響並不大。

五、js腳本在java虛擬機中運行的性能比較

由實驗數據可得:js腳本在jvm中運行,使用函數比不使用函數仍是有着必定的性能差距。同時。js代碼在jvm中的運行廣泛較慢,所以在java開發中要慎重的使用js腳本。

六、總結:

在本次的實驗中:各語言的執行效率 java > js在瀏覽器中執行 > C++ > js在jvm中執行 > python

同時,頻繁的使用函數的確會形成少量的執行效率的損失,可是對於大多數語言(python除外),其速度差別並非很明顯,所以在開發中要根據不一樣編程語言的特色進行合理的使用。

下面將會貼出本次實驗各個語言的實驗代碼和首次運行的實驗截圖

七、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++;
    }
}

八、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++;
}

九、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")

十、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>

十一、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++;
}

相關文章
相關標籤/搜索