Skip to content

Instantly share code, notes, and snippets.

@cannium
Created September 13, 2018 03:40
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save cannium/dab43ef7b2fc7fb272b7ca583403920a to your computer and use it in GitHub Desktop.
Save cannium/dab43ef7b2fc7fb272b7ca583403920a to your computer and use it in GitHub Desktop.
a small performance test
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