memset

package module
v0.0.0-...-6fb7a21 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Sep 4, 2019 License: BSD-3-Clause Imports: 1 Imported by: 3

README

go-memset

GoDoc Build Status

An efficient memset implementation for Golang.

In Golang the following loop is optimised with an assembly implementation in src/runtime/memclr_$GOARCH.s (since 137880043):

for i := range data {
	data[i] = 0
}

but the following loop is not optimised:

for i := range data {
	data[i] = 0xff
}

and neither is:

for i := range data {
	data[i] = value
}

go-memset provides a Memset function which uses an assembly implementation on x86-64 and can provide performance equivalent to the optimised first loop.

Download

go get github.com/tmthrgd/go-memset

Benchmark

BenchmarkMemset/32-8  	200000000	         6.32 ns/op	5060.69 MB/s
BenchmarkMemset/128-8 	200000000	         6.55 ns/op	19527.77 MB/s
BenchmarkMemset/1k-8  	50000000	        22.9 ns/op	44788.18 MB/s
BenchmarkMemset/16k-8 	 5000000	       278 ns/op	58868.04 MB/s
BenchmarkMemset/128k-8	  500000	      3726 ns/op	35171.08 MB/s
BenchmarkMemset/1M-8  	   30000	     40219 ns/op	26071.10 MB/s
BenchmarkMemset/16M-8 	    2000	   1120266 ns/op	14976.09 MB/s
BenchmarkMemset/128M-8	     200	   8749141 ns/op	15340.67 MB/s
BenchmarkMemset/512M-8	      50	  35078079 ns/op	15305.03 MB/s
BenchmarkGoZero/32-8  	500000000	         3.43 ns/op	9326.33 MB/s
BenchmarkGoZero/128-8 	300000000	         4.50 ns/op	28414.80 MB/s
BenchmarkGoZero/1k-8  	100000000	        19.1 ns/op	53557.45 MB/s
BenchmarkGoZero/16k-8 	 5000000	       278 ns/op	58854.20 MB/s
BenchmarkGoZero/128k-8	  500000	      3733 ns/op	35102.85 MB/s
BenchmarkGoZero/1M-8  	   50000	     39968 ns/op	26234.86 MB/s
BenchmarkGoZero/16M-8 	    1000	   1319397 ns/op	12715.81 MB/s
BenchmarkGoZero/128M-8	     100	  10682865 ns/op	12563.83 MB/s
BenchmarkGoZero/512M-8	      30	  42689135 ns/op	12576.29 MB/s
BenchmarkGoSet/32-8   	100000000	        17.4 ns/op	1840.05 MB/s
BenchmarkGoSet/128-8  	20000000	        73.0 ns/op	1754.20 MB/s
BenchmarkGoSet/1k-8   	 3000000	       545 ns/op	1878.82 MB/s
BenchmarkGoSet/16k-8  	  200000	      8638 ns/op	1896.63 MB/s
BenchmarkGoSet/128k-8 	   20000	     69077 ns/op	1897.47 MB/s
BenchmarkGoSet/1M-8   	    3000	    552612 ns/op	1897.49 MB/s
BenchmarkGoSet/16M-8  	     200	   8867019 ns/op	1892.09 MB/s
BenchmarkGoSet/128M-8 	      20	  70937303 ns/op	1892.06 MB/s
BenchmarkGoSet/512M-8 	       5	 283412563 ns/op	1894.31 MB/s
benchmark                old ns/op     new ns/op     delta
BenchmarkZero/32-8       3.43          6.32          +84.26%
BenchmarkZero/128-8      4.50          6.55          +45.56%
BenchmarkZero/1k-8       19.1          22.9          +19.90%
BenchmarkZero/16k-8      278           278           +0.00%
BenchmarkZero/128k-8     3733          3726          -0.19%
BenchmarkZero/1M-8       39968         40219         +0.63%
BenchmarkZero/16M-8      1319397       1120266       -15.09%
BenchmarkZero/128M-8     10682865      8749141       -18.10%
BenchmarkZero/512M-8     42689135      35078079      -17.83%
BenchmarkSet/32-8        17.4          6.32          -63.68%
BenchmarkSet/128-8       73.0          6.55          -91.03%
BenchmarkSet/1k-8        545           22.9          -95.80%
BenchmarkSet/16k-8       8638          278           -96.78%
BenchmarkSet/128k-8      69077         3726          -94.61%
BenchmarkSet/1M-8        552612        40219         -92.72%
BenchmarkSet/16M-8       8867019       1120266       -87.37%
BenchmarkSet/128M-8      70937303      8749141       -87.67%
BenchmarkSet/512M-8      283412563     35078079      -87.62%

benchmark                old MB/s     new MB/s     speedup
BenchmarkZero/32-8       9326.33      5060.69      0.54x
BenchmarkZero/128-8      28414.80     19527.77     0.69x
BenchmarkZero/1k-8       53557.45     44788.18     0.84x
BenchmarkZero/16k-8      58854.20     58868.04     1.00x
BenchmarkZero/128k-8     35102.85     35171.08     1.00x
BenchmarkZero/1M-8       26234.86     26071.10     0.99x
BenchmarkZero/16M-8      12715.81     14976.09     1.18x
BenchmarkZero/128M-8     12563.83     15340.67     1.22x
BenchmarkZero/512M-8     12576.29     15305.03     1.22x
BenchmarkSet/32-8        1840.05      5060.69      2.75x
BenchmarkSet/128-8       1754.20      19527.77     11.13x
BenchmarkSet/1k-8        1878.82      44788.18     23.84x
BenchmarkSet/16k-8       1896.63      58868.04     31.04x
BenchmarkSet/128k-8      1897.47      35171.08     18.54x
BenchmarkSet/1M-8        1897.49      26071.10     13.74x
BenchmarkSet/16M-8       1892.09      14976.09     7.92x
BenchmarkSet/128M-8      1892.06      15340.67     8.11x
BenchmarkSet/512M-8      1894.31      15305.03     8.08x

License

Unless otherwise noted, the go-memset source files are distributed under the Modified BSD License found in the LICENSE file.

Documentation

Overview

Package memset is an efficient memset implementation for Golang.

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func Memset

func Memset(data []byte, value byte)

Memset sets each byte in data to value.

Types

This section is empty.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL