From 735ba52aded1a1d77a521957982bc0f95ebcfa58 Mon Sep 17 00:00:00 2001 From: Shraddha Agrawal Date: Mon, 29 Jan 2024 22:31:57 +0530 Subject: [PATCH] attempt 10: ignore reading the decimal point when processing city temp --- README.md | 3 ++- main.go | 20 ++++++++++---------- profiles/cpu-remove-slice.prof | Bin 0 -> 21843 bytes 3 files changed, 12 insertions(+), 11 deletions(-) create mode 100644 profiles/cpu-remove-slice.prof diff --git a/README.md b/README.md index 92cac43..244fb5e 100644 --- a/README.md +++ b/README.md @@ -11,4 +11,5 @@ |6|Convert temperature from `string` to `int64`, process in `int64` and convert to `float64` at the end. |2:51.50|-41.14|[7812da4](https://github.com/shraddhaag/1brc/commit/7812da4d0be07dd4686d5f9b9df1e93b08cd0dd1)| |7|In the city <> temperatures map, replaced the value for each key (city) to preprocessed min, max, count and sum of all temperatures instead of storing all recorded temperatures for the city.|1:39.81|-71.79|[e5213a8](https://github.com/shraddhaag/1brc/commit/e5213a836b17bec0a858474a11f07c902e724bba)| |8|Use producer consumer pattern to read file in chunks and process the chunks in parallel.|1:43.82|+14.01|[067f2a4](https://github.com/shraddhaag/1brc/commit/067f2a44c0d6b3bb7cc073639364f733bce09e3e)| -|9|Reduce memory allocation by processing each read chunk into a map. Result channel now can collate the smaller processed chunk maps.|0:28.544|-75.286|| \ No newline at end of file +|9|Reduce memory allocation by processing each read chunk into a map. Result channel now can collate the smaller processed chunk maps.|0:28.544|-75.286|[d4153ac](https://github.com/shraddhaag/1brc/commit/d4153ac7a841170a5ceee47d930e97738b5a19f6)| +|10|Avoid string concatenation overhead by not reading the decimal point when processing city temperature.|0:24.752|-3.792|| \ No newline at end of file diff --git a/main.go b/main.go index 7d66a20..61f3735 100644 --- a/main.go +++ b/main.go @@ -176,24 +176,19 @@ func readFileLineByLineIntoAMap(filepath string) (map[string]cityTemperatureInfo return mapOfTemp, nil } -func convertStringToInt64(input string) int64 { - input = input[:len(input)-2] + input[len(input)-1:] - output, _ := strconv.ParseInt(input, 10, 64) - return output -} - func processReadChunk(buf []byte, resultStream chan<- map[string]cityTemperatureInfo) { var stringsBuilder strings.Builder toSend := make(map[string]cityTemperatureInfo) var city string for _, char := range buf { - if char == ';' { + switch char { + case ';': city = stringsBuilder.String() stringsBuilder.Reset() - } else if char == '\n' { + case '\n': if stringsBuilder.Len() != 0 && len(city) != 0 { - temp := convertStringToInt64(stringsBuilder.String()) + temp, _ := strconv.ParseInt(stringsBuilder.String(), 10, 64) stringsBuilder.Reset() if val, ok := toSend[city]; ok { @@ -215,8 +210,13 @@ func processReadChunk(buf []byte, resultStream chan<- map[string]cityTemperature sum: temp, } } + city = "" + } + case '.': + if len(city) != 0 { + continue } - } else { + default: stringsBuilder.WriteByte(char) } } diff --git a/profiles/cpu-remove-slice.prof b/profiles/cpu-remove-slice.prof new file mode 100644 index 0000000000000000000000000000000000000000..144b701df7356128198ae1d3fd51cfdb13930658 GIT binary patch literal 21843 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

%%Vx0=Cl9I~ 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