From cda4f4ac9eb2333f55685f98bd495f4f1379d3a8 Mon Sep 17 00:00:00 2001 From: chrislu Date: Mon, 27 Oct 2025 19:17:09 -0700 Subject: [PATCH] optimize: pre-calculate row sizes in EC encoding loop --- weed/storage/erasure_coding/ec_encoder.go | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/weed/storage/erasure_coding/ec_encoder.go b/weed/storage/erasure_coding/ec_encoder.go index 4e33dbb74..68b6a3fa9 100644 --- a/weed/storage/erasure_coding/ec_encoder.go +++ b/weed/storage/erasure_coding/ec_encoder.go @@ -228,21 +228,25 @@ func encodeDatFile(remainingSize int64, baseFileName string, bufferSize int, lar return fmt.Errorf("failed to open ec files %s: %v", baseFileName, err) } - for remainingSize > largeBlockSize*int64(ctx.DataShards) { + // Pre-calculate row sizes to avoid redundant calculations in loops + largeRowSize := largeBlockSize * int64(ctx.DataShards) + smallRowSize := smallBlockSize * int64(ctx.DataShards) + + for remainingSize > largeRowSize { err = encodeData(file, enc, processedSize, largeBlockSize, buffers, outputs, ctx) if err != nil { return fmt.Errorf("failed to encode large chunk data: %w", err) } - remainingSize -= largeBlockSize * int64(ctx.DataShards) - processedSize += largeBlockSize * int64(ctx.DataShards) + remainingSize -= largeRowSize + processedSize += largeRowSize } for remainingSize > 0 { err = encodeData(file, enc, processedSize, smallBlockSize, buffers, outputs, ctx) if err != nil { return fmt.Errorf("failed to encode small chunk data: %w", err) } - remainingSize -= smallBlockSize * int64(ctx.DataShards) - processedSize += smallBlockSize * int64(ctx.DataShards) + remainingSize -= smallRowSize + processedSize += smallRowSize } return nil }