數據庫內使用 Rust 編寫存儲過程,使用 pgxr 程序庫;git
數據庫外使用 Go 語言,使用 pgx 鏈接數據庫進行查詢;github
邏輯都是查詢某個表的字段列表,循環執行10000次;sql
測試結果以下:數據庫
Rust 存儲過程:swift
test_sql_speed: 26.810285862s
Go 鏈接數據庫查詢:bash
32.746561715s
Go 語言只創建一次鏈接。性能
看來複用鏈接的話開銷很小的嘛,一次只須要花費 0.5 毫秒左右。測試
而後,又測試了最簡單的 SQL 查詢:SELECT 1,一樣也是 10000 次;code
此次,Rust 存儲過程:orm
test_sql_speed: 67.651917ms
Go 鏈接數據庫查詢:
1.261617769s
數據庫內查詢那是至關快的,這樣算來每次處理鏈接的耗時大概在 0.1 毫秒左右。
源代碼以下:
Rust
#[no_mangle] pub extern "C" fn test_sql_speed(_fcinfo: FunctionCallInfo) -> Datum { let sys_time = SystemTime::now(); for _ in 1..10000 { let _i = query_for_int("select 1"); } let difference = SystemTime::now().duration_since(sys_time) .expect("SystemTime::duration_since failed"); eprintln!("test_sql_speed: {:?}", difference); PG_RETURN_I32(1) }
Go
func main() { db := openDbConnection() start := time.Now() i := 0 for i = 1; i <= 10000; i++ { db.Query(`SELECT 1`) } t := time.Now() elapsed := t.Sub(start) fmt.Printf("%v\n", elapsed) }
後來發現用於查詢表字段的方法效率不行,是從 information_schema
這個 ANSI 標準目錄裏去查的,後來看了一些資料,改爲從 pg_catalog
這個原生目錄去查,結果性能有了大幅提高。
Rust 裏查詢一萬次只用了 1 秒,Go 裏查詢一萬次用了 3 秒。