// scala 合算実験 <http://w...content-available-to-author-only...e.jp/asahi/hishidama/home/tech/scala/sample/sum.html>
// に参加してみた (by @akihiro4chawon)
// ・基本的に @hishidama さんのルーチンを流用
// ・再帰関数が、Array/Vectorに不利なルーチン(毎回 tail をとっている)になっているのを修正(添字による)
// なお、このパフォーマンスについては、IndexedSeq と LinearSeq の違いについて踏まえた上で文書化されている
// ・最速ルーチンを提案してみた (def sumByFastestWhile)
// ただし、これが最速であることは規格としては保証されない。scala/JVM実装依存
)
val list
= List.
range(1,
10000+
1).
map(n
=> Sample
(1,n,n
*5)) val vector
= Range
(1,
10000+
1).
map(n
=> Sample
(1,n,n
*5)) val array
= Array.
range(1,
10000+
1).
map(n
=> Sample
(1,n,n
*5))
def benchmark
(times
: Int, mult
: Int
= 1)(f
: =>Any
) = new scala.
testing.
Benchmark{ multiplier
= mult
; def run
() = f
}.
runBenchmark(times
) new { def report
() = { println
(list
); println
((list.
sum - list.
max - list.
min).
toDouble /
(list.
size-
2)) }}
def sumByWhile
(list
: Seq
[Sample
]) = { sum1 += c.value1
sum2 += c.value2
sum3 += c.value3
}
(sum1, sum2, sum3)
}
def sumByFastestWhile
(list
: Array
[Sample
]): (Int, Int, Long
) = { sum1 += c.value1
sum2 += c.value2
sum3 += c.value3
idx += 1
}
case e
: java.
lang.
ArrayIndexOutOfBoundsException => // loop finished! }
assert
(false) // How'd they finished the loop? }
def sumByRec
(list
: Seq
[Sample
]) = { def f
(list
:Seq
[Sample
], sum1
:Int
= 0, sum2
:Int
= 0, sum3
:Long
= 0L
): (Int,Int,Long
) = { (sum1, sum2, sum3)
f(list.tail, sum1+c.value1, sum2+c.value2, sum3+c.value3)
}
}
f(list)
}
def sumByRec2
(list
: Seq
[Sample
]) = { def f
(idx
: Int, sum1
: Int
= 0, sum2
: Int
= 0, sum3
: Long
= 0L
): (Int, Int, Long
) = { (sum1, sum2, sum3)
f(idx + 1, sum1 + c.value1, sum2 + c.value2, sum3 + c.value3)
}
}
f(0)
}
def main
(args
: Array
[String
]) { println(" --- sum by while --- ")
println("list")
benchmark(10, 100){ sumByWhile(list) }.report
println("vector")
benchmark(10, 100){ sumByWhile(vector) }.report
println("array")
benchmark(10, 100){ sumByWhile(array) }.report
println(" --- sum by recursion --- ")
benchmark(10, 100){ sumByRec(list) }.report
//benchmark(10, 100){ sumByRec(vector) }.report // 論外
//benchmark(10, 100){ sumByRec(array) }.report // 論外
//benchmark(10, 100){ sumByRec2(list) }.report // 論外
benchmark(10, 100){ sumByRec2(vector) }.report
benchmark(10, 100){ sumByRec2(array) }.report
println(" --- 最速の例外脱出法 --- ")
benchmark(10, 100){ sumByFastestWhile(array) }.report
}
}
Ci8vIHNjYWxhIOWQiOeul+Wun+mokyA8aHR0cDovL3cuLi5jb250ZW50LWF2YWlsYWJsZS10by1hdXRob3Itb25seS4uLmUuanAvYXNhaGkvaGlzaGlkYW1hL2hvbWUvdGVjaC9zY2FsYS9zYW1wbGUvc3VtLmh0bWw+IAovLyDjgavlj4LliqDjgZfjgabjgb/jgZ8gKGJ5IEBha2loaXJvNGNoYXdvbikKCi8vIOODu+WfuuacrOeahOOBqyBAaGlzaGlkYW1hIOOBleOCk+OBruODq+ODvOODgeODs+OCkua1geeUqAovLyDjg7vlho3luLDplqLmlbDjgYzjgIFBcnJheS9WZWN0b3LjgavkuI3liKnjgarjg6vjg7zjg4Hjg7PvvIjmr47lm54gdGFpbCDjgpLjgajjgaPjgabjgYTjgovvvInjgavjgarjgaPjgabjgYTjgovjga7jgpLkv67mraPvvIjmt7vlrZfjgavjgojjgovvvIkKLy8gICDjgarjgYrjgIHjgZPjga7jg5Hjg5Xjgqnjg7zjg57jg7PjgrnjgavjgaTjgYTjgabjga/jgIFJbmRleGVkU2VxIOOBqCBMaW5lYXJTZXEg44Gu6YGV44GE44Gr44Gk44GE44Gm6LiP44G+44GI44Gf5LiK44Gn5paH5pu45YyW44GV44KM44Gm44GE44KLCi8vIOODu+acgOmAn+ODq+ODvOODgeODs+OCkuaPkOahiOOBl+OBpuOBv+OBnyAoZGVmIHN1bUJ5RmFzdGVzdFdoaWxlKQovLyAgIOOBn+OBoOOBl+OAgeOBk+OCjOOBjOacgOmAn+OBp+OBguOCi+OBk+OBqOOBr+imj+agvOOBqOOBl+OBpuOBr+S/neiovOOBleOCjOOBquOBhOOAgnNjYWxhL0pWTeWun+ijheS+neWtmAoKb2JqZWN0IE1haW4gewogIGNhc2UgY2xhc3MgU2FtcGxlKAogICAgdmFsIHZhbHVlMTogSW50LAogICAgdmFsIHZhbHVlMjogSW50LAogICAgdmFsIHZhbHVlMzogTG9uZwogICkKICB2YWwgbGlzdCA9IExpc3QucmFuZ2UoMSwgMTAwMDArMSkubWFwKG4gPT4gU2FtcGxlKDEsbixuKjUpKQogIHZhbCB2ZWN0b3IgPSBSYW5nZSgxLCAxMDAwMCsxKS5tYXAobiA9PiBTYW1wbGUoMSxuLG4qNSkpCiAgdmFsIGFycmF5ID0gQXJyYXkucmFuZ2UoMSwgMTAwMDArMSkubWFwKG4gPT4gU2FtcGxlKDEsbixuKjUpKSAKICAKICBkZWYgYmVuY2htYXJrKHRpbWVzOiBJbnQsIG11bHQ6IEludCA9IDEpKGY6ID0+QW55KSA9CiAgICBuZXcgc2NhbGEudGVzdGluZy5CZW5jaG1hcmt7IG11bHRpcGxpZXIgPSBtdWx0OyBkZWYgcnVuKCkgPSBmIH0ucnVuQmVuY2htYXJrKHRpbWVzKQogIGltcGxpY2l0IGRlZiBiZW5jaG1hcmsycmVwb3J0KGxpc3Q6TGlzdFtMb25nXSkgPQogICAgbmV3IHsgZGVmIHJlcG9ydCgpID0geyBwcmludGxuKGxpc3QpOyBwcmludGxuKChsaXN0LnN1bSAtIGxpc3QubWF4IC0gbGlzdC5taW4pLnRvRG91YmxlIC8gKGxpc3Quc2l6ZS0yKSkgfX0KICAgIAogIGRlZiBzdW1CeVdoaWxlKGxpc3Q6IFNlcVtTYW1wbGVdKSA9IHsKICAgIHZhciBzdW0xID0gMAogICAgdmFyIHN1bTIgPSAwCiAgICB2YXIgc3VtMyA9IDBMCiAgICB2YWwgaSA9IGxpc3QuaXRlcmF0b3IKICAgIHdoaWxlKGkuaGFzTmV4dCkgewogICAgICB2YWwgYyA9IGkubmV4dAogICAgICBzdW0xICs9IGMudmFsdWUxCiAgICAgIHN1bTIgKz0gYy52YWx1ZTIKICAgICAgc3VtMyArPSBjLnZhbHVlMwogICAgfQogICAgKHN1bTEsIHN1bTIsIHN1bTMpICAKICB9CiAgCiAgZGVmIHN1bUJ5RmFzdGVzdFdoaWxlKGxpc3Q6IEFycmF5W1NhbXBsZV0pOiAoSW50LCBJbnQsIExvbmcpID0gewogICAgdmFyIHN1bTEsIHN1bTIgPSAwCiAgICB2YXIgc3VtMzogTG9uZyA9IDBMCiAgICB2YXIgaWR4ID0gMAogICAgdHJ5IHsKICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICB2YWwgYyA9IGxpc3QoaWR4KQogICAgICAgIHN1bTEgKz0gYy52YWx1ZTEKICAgICAgICBzdW0yICs9IGMudmFsdWUyCiAgICAgICAgc3VtMyArPSBjLnZhbHVlMwogICAgICAgIGlkeCArPSAxCiAgICAgIH0KICAgIH0gY2F0Y2ggewogICAgICBjYXNlIGU6IGphdmEubGFuZy5BcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gPT4gLy8gbG9vcCBmaW5pc2hlZCEKICAgICAgcmV0dXJuIChzdW0xLCBzdW0yLCBzdW0zKQogICAgfQogICAgYXNzZXJ0KGZhbHNlKSAvLyBIb3cnZCB0aGV5IGZpbmlzaGVkIHRoZSBsb29wPwogICAgbnVsbAogIH0KICAKICBkZWYgc3VtQnlSZWMobGlzdDogU2VxW1NhbXBsZV0pID0gewogICAgZGVmIGYobGlzdDpTZXFbU2FtcGxlXSwgc3VtMTpJbnQgPSAwLCBzdW0yOkludCA9IDAsIHN1bTM6TG9uZyA9IDBMKTogKEludCxJbnQsTG9uZykgPSB7CiAgICAgIGlmKGxpc3QuaXNFbXB0eSkgewogICAgICAgIChzdW0xLCBzdW0yLCBzdW0zKQogICAgICB9IGVsc2UgewogICAgICAgIHZhbCBjID0gbGlzdC5oZWFkCiAgICAgICAgZihsaXN0LnRhaWwsIHN1bTErYy52YWx1ZTEsIHN1bTIrYy52YWx1ZTIsIHN1bTMrYy52YWx1ZTMpCiAgICAgIH0KICAgIH0KICAgIGYobGlzdCkKICB9CiAgCiAgZGVmIHN1bUJ5UmVjMihsaXN0OiBTZXFbU2FtcGxlXSkgPSB7CiAgICBkZWYgZihpZHg6IEludCwgc3VtMTogSW50ID0gMCwgc3VtMjogSW50ID0gMCwgc3VtMzogTG9uZyA9IDBMKTogKEludCwgSW50LCBMb25nKSA9IHsKICAgICAgaWYgKGxpc3Quc2l6ZSA9PSBpZHgpCiAgICAgICAgKHN1bTEsIHN1bTIsIHN1bTMpCiAgICAgIGVsc2UgewogICAgICAgIHZhbCBjID0gbGlzdChpZHgpCiAgICAgICAgZihpZHggKyAxLCBzdW0xICsgYy52YWx1ZTEsIHN1bTIgKyBjLnZhbHVlMiwgc3VtMyArIGMudmFsdWUzKQogICAgICB9CiAgICB9CiAgICBmKDApCiAgfQogICAgCiAgZGVmIG1haW4oYXJnczogQXJyYXlbU3RyaW5nXSkgewogICAgcHJpbnRsbigiIC0tLSBzdW0gYnkgd2hpbGUgLS0tICIpCiAgICBwcmludGxuKCJsaXN0IikKICAgIGJlbmNobWFyaygxMCwgMTAwKXsgc3VtQnlXaGlsZShsaXN0KSB9LnJlcG9ydAogICAgcHJpbnRsbigidmVjdG9yIikKICAgIGJlbmNobWFyaygxMCwgMTAwKXsgc3VtQnlXaGlsZSh2ZWN0b3IpIH0ucmVwb3J0CiAgICBwcmludGxuKCJhcnJheSIpCiAgICBiZW5jaG1hcmsoMTAsIDEwMCl7IHN1bUJ5V2hpbGUoYXJyYXkpIH0ucmVwb3J0CgogICAgcHJpbnRsbigiIC0tLSBzdW0gYnkgcmVjdXJzaW9uIC0tLSAiKQogICAgYmVuY2htYXJrKDEwLCAxMDApeyBzdW1CeVJlYyhsaXN0KSB9LnJlcG9ydAogICAgLy9iZW5jaG1hcmsoMTAsIDEwMCl7IHN1bUJ5UmVjKHZlY3RvcikgfS5yZXBvcnQgLy8g6KuW5aSWCiAgICAvL2JlbmNobWFyaygxMCwgMTAwKXsgc3VtQnlSZWMoYXJyYXkpIH0ucmVwb3J0IC8vIOirluWklgogICAgCiAgICAvL2JlbmNobWFyaygxMCwgMTAwKXsgc3VtQnlSZWMyKGxpc3QpIH0ucmVwb3J0IC8vIOirluWklgogICAgYmVuY2htYXJrKDEwLCAxMDApeyBzdW1CeVJlYzIodmVjdG9yKSB9LnJlcG9ydAogICAgYmVuY2htYXJrKDEwLCAxMDApeyBzdW1CeVJlYzIoYXJyYXkpIH0ucmVwb3J0CiAgICAKICAgIHByaW50bG4oIiAtLS0g5pyA6YCf44Gu5L6L5aSW6ISx5Ye65rOVIC0tLSAiKQogICAgYmVuY2htYXJrKDEwLCAxMDApeyBzdW1CeUZhc3Rlc3RXaGlsZShhcnJheSkgfS5yZXBvcnQKCiAgfQogIAp9
--- sum by while ---
list
List(73, 66, 64, 64, 61, 61, 61, 61, 61, 61)
62.375
vector
List(37, 31, 30, 30, 31, 31, 31, 30, 31, 31)
30.75
array
List(38, 34, 33, 34, 34, 34, 33, 34, 34, 34)
33.875
--- sum by recursion ---
List(47, 40, 39, 39, 40, 40, 40, 39, 40, 40)
39.75
List(78, 68, 67, 68, 67, 68, 68, 67, 67, 67)
67.5
List(62, 67, 61, 69, 70, 68, 63, 60, 61, 62)
64.125
--- 最速の例外脱出法 ---
List(11, 7, 8, 8, 8, 7, 7, 8, 8, 8)
7.75