Created
September 13, 2018 03:40
-
-
Save cannium/dab43ef7b2fc7fb272b7ca583403920a to your computer and use it in GitHub Desktop.
a small performance test
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package main | |
import ( | |
"fmt" | |
"time" | |
ma "github.com/multiformats/go-multiaddr" | |
) | |
var addrs = []string{ | |
"/ip4/127.0.0.1/tcp/4001/ipfs/QmPdJvfK74MknGSYS2E54EEzKcEY6c19D8BzcCPbW7Sjna", | |
"/ip4/159.203.36.22/tcp/4001/ipfs/QmPdJvfK74MknGSYS2E54EEzKcEY6c19D8BzcCPbW7Sjna", | |
"/ip4/10.20.0.5/tcp/4001/ipfs/QmPdJvfK74MknGSYS2E54EEzKcEY6c19D8BzcCPbW7Sjna", | |
"/ip6/::1/tcp/4001/ipfs/QmPdJvfK74MknGSYS2E54EEzKcEY6c19D8BzcCPbW7Sjna", | |
"/ip6/2604:a880:cad:d0::bf0:e001/tcp/4001/ipfs/QmPdJvfK74MknGSYS2E54EEzKcEY6c19D8BzcCPbW7Sjna", | |
"/ip4/159.203.36.22/tcp/4001/ipfs/QmPdJvfK74MknGSYS2E54EEzKcEY6c19D8BzcCPbW7Sjna", | |
"/ip6/2604:a880:cad:d0::bf0:e001/tcp/4001/ipfs/QmPdJvfK74MknGSYS2E54EEzKcEY6c19D8BzcCPbW7Sjna", | |
} | |
func main() { | |
maddrs := make([]ma.Multiaddr, 0, len(addrs)) | |
for _, addr := range addrs { | |
maddr, err := ma.NewMultiaddr(addr) | |
if err != nil { | |
fmt.Println(err) | |
return | |
} | |
maddrs = append(maddrs, maddr) | |
} | |
a := []ma.Multiaddr{ | |
maddrs[0], maddrs[1], maddrs[2], | |
} | |
b := []ma.Multiaddr{ | |
maddrs[3], maddrs[4], maddrs[5], | |
} | |
c := []ma.Multiaddr{ | |
maddrs[2], maddrs[4], maddrs[6], | |
} | |
N := 1000000 | |
var merged []ma.Multiaddr | |
timeA := time.Now() | |
for i:=0;i<N;i++{ | |
merged = mergeAddrs1(a,b,c) | |
} | |
timeB := time.Now() | |
for i:=0;i<N;i++{ | |
merged = mergeAddrs2(a,b,c) | |
} | |
timeC := time.Now() | |
fmt.Println("mergeAddrs1", timeB.Sub(timeA)) | |
fmt.Println("mergeAddrs2", timeC.Sub(timeB)) | |
fmt.Println(merged) | |
} | |
// mergeAddrs merges input address lists, leave only unique addresses | |
func mergeAddrs1(addrLists ...[]ma.Multiaddr) (uniqueAddrs []ma.Multiaddr) { | |
// calculate an approximate output `uniqueAddrs` length | |
var addrCountUpperBound int | |
for _, addrList := range addrLists { | |
addrCountUpperBound += len(addrList) | |
} | |
exists := make(map[string]bool, addrCountUpperBound) | |
uniqueAddrs = make([]ma.Multiaddr, 0, addrCountUpperBound) | |
for _, addrList := range addrLists { | |
for _, addr := range addrList { | |
k := string(addr.Bytes()) | |
if exists[k] { | |
continue | |
} | |
exists[k] = true | |
uniqueAddrs = append(uniqueAddrs, addr) | |
} | |
} | |
return uniqueAddrs | |
} | |
// mergeAddrs merges input address lists, leave only unique addresses | |
func mergeAddrs2(addrLists ...[]ma.Multiaddr) (uniqueAddrs []ma.Multiaddr) { | |
exists := make(map[string]bool) | |
for _, addrList := range addrLists { | |
for _, addr := range addrList { | |
k := string(addr.Bytes()) | |
if exists[k] { | |
continue | |
} | |
exists[k] = true | |
uniqueAddrs = append(uniqueAddrs, addr) | |
} | |
} | |
return uniqueAddrs | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment