爲了純粹的教育目的,我創建了一個base58包。它將編碼/使用bitcoin base58 symbol chart解碼uint64
,例如:如何同時迭代int範圍
b58 := Encode(100) // return 2j
num := Decode("2j") // return 100
在創建我帶着this的第一次測試:
func TestEncode(t *testing.T) {
var i uint64
for i = 0; i <= (1<<64 - 1); i++ {
b58 := Encode(i)
num := Decode(b58)
if num != i {
t.Fatalf("Expecting %d for %s", i, b58)
}
}
}
這種「幼稚」的實施,會嘗試把所有的範圍從uint64(從0到18,446,744,073,709,551,615)到base58,然後返回到uint64,但花費太多時間。
爲了更好地理解go如何處理併發性,我想知道如何使用通道或goroutines並以最有效的方式在整個uint64範圍內執行迭代?
數據是否可以通過塊並行處理,如果是的話如何實現?
在此先感謝。
UPDATE:
像由@Adrien在回答提到,一個方法是使用t.Parallel()但只是測試包時適用,在任何情況下,通過實現它,我發現這是明顯慢了,它並行運行,但沒有速度增益。
我明白,拼盡了全力uint64
可能需要幾年時間,但我想要的東西找到/現在怎麼可能一個通道或夠程,可能有助於加快這一進程(小範圍1<<16
測試)可能是通過使用這樣的事情https://play.golang.org/p/9U22NfrXeq只是一個例子。
問題不在於如何測試軟件包是關於什麼算法,可以使用技術通過使用併發來更快地進行迭代。
請注意,此測試也不能證明您的實現實際上是正確的;只有解碼/編碼匹配。如果他們都以同樣的方式錯誤,測試將通過。您需要對照規範值進行測試以證明正確性。 – Adrian
如果您的編碼/解碼能夠在一個CPU上每秒完成10億次轉換(這非常樂觀),您需要60個CPU才能在10年內完成此任務。這是假設從goroutines和渠道沒有開銷。 –
@PaulHankin你是完全正確的,但我的想法是試圖理解如何解決這個問題時,通過使用頻道goroutines處理素數,儘管需要幾年,我想了解更多關於如何優化。 – nbari