實驗背景:
一、前一段時間,在與老師共同開發的過程當中,老師提出了少用函數,函數會形成所開發系統的性能的損失。對於這一點,我是贊同的,但同時以爲形成的系統性能的損失應該也是很微下的。所以,有了本次的實驗。
二、本次實驗將會從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++;
}