1. はじめに
Go言語にはStackが実装されていませんが、
Stackの処理自体は、どの言語でも、
配列や線形リストを使って自作で実装することができます。
Go言語向けに自作で作ったついでに、
Stackが実装されている他言語との処理速度(処理時間)を比較してみました。
実験で使用した言語は、
- C#(.NET Core3.0)
- go1.14.4
- java 13.0.2
- Python 3.8.3
の4言語です。
各言語のソースは、githubでも公開しています。
https://github.com/NobuyukiInoue/StackSpeedTest
C#
https://github.com/NobuyukiInoue/StackSpeedTest/tree/master/Project_CSGo(配列でStackを実装)
https://github.com/NobuyukiInoue/StackSpeedTest/tree/master/Project_Go_Stack_by_ArrayGo(線形リストでStackを実装)
https://github.com/NobuyukiInoue/StackSpeedTest/tree/master/Project_Go_Stack_by_ListNodeJava
https://github.com/NobuyukiInoue/StackSpeedTest/tree/master/Project_JavaPython
https://github.com/NobuyukiInoue/StackSpeedTest/tree/master/Project_Python3
2. 言語別のメソッド比較
Stackといっても、言語によって、各種操作がメソッドで提供されていたり、プロパティでチェックしなければならないなど、細かな処理の実装内容が異なります。
今回の実験で行った処理を比較すると、以下のようになります。
| 処理内容 | C#(.NET Core3.x) | Java 8 | Python3.8.3 |
|---|---|---|---|
| Stackへの書き込み | Pushメソッド | pushメソッド | append関数 |
| Stackからの取り出し | Popメソッド | popメソッド | pop関数 |
| 値の検索 | Containsメソッド (戻り値は値の存在の有無(bool型)) | searchメソッド (戻り値はindex番号) | index関数 |
| Stackが空かどうか調べる | Countプロパティを利用 | emptyメソッド | len関数を利用 |
3. 検証環境と実験結果(2020/07/11追記)
| 項目 | 値 |
|---|---|
| OS | MS-Windows 10 |
| CPU | Intel Core-i7 8559u |
| メモリ | 16GB(LPDDR3/2133MHz) |
メモリ容量を追記しました。(2020/07/11)
処理の内容は、
- 0~1億までの数値のpush()
- 最も深い位置にある値0の検索
- 1億~0までのPop()
です。
各言語での処理時間は以下の通りです。
C# NET Core 3.0.100
Stackクラスを使用
https://docs.microsoft.com/ja-jp/dotnet/api/system.collections.generic.stack-1?view=netcore-3.1
| times | Execution time |
|---|---|
| 1st | 977 [ms] |
| 2nd | 1003 [ms] |
| 3rd | 1004 [ms] |
go1.14.4 windows/amd64(配列版)
| times | Execution time |
|---|---|
| 1st | 2089 [ms] |
| 2nd | 1853 [ms] |
| 3rd | 1737 [ms] |
go1.14.4 windows/amd64(線形リスト版)
| times | Execution time |
|---|---|
| 1st | 5617 [ms] |
| 2nd | 5400 [ms] |
| 3rd | 5569 [ms] |
java 13.0.2 2020-01-14
クラスStackを使用
https://docs.oracle.com/javase/jp/8/docs/api/java/util/Stack.html
| times | Execution time |
|---|---|
| 1st | 6743 [ms] |
| 2nd | 6741 [ms] |
| 3rd | 6733 [ms] |
Python 3.8.3
| times | Execution time |
|---|---|
| 1st | 16957 [ms] |
| 2nd | 16561 [ms] |
| 3rd | 17558 [ms] |
関連(2020/07/11追記)
LeetCodeのProblemの中にも、Stackを自分で実装する問題があります。
いろんな言語での回答例が投稿されているので、処理時間を比較するのも面白いと思います。
- 225. Implement Stack using Queues
https://leetcode.com/problems/implement-stack-using-queues/