From efcd9dcc5e93fc313b0cd37e267bbf141675826c Mon Sep 17 00:00:00 2001 From: Steven Lang Date: Thu, 2 Feb 2012 20:22:04 +0100 Subject: [PATCH] Optimize pattern filling by limiting small calls to memcpy In looking at profiling the speed of fill_pattern(), it calls memcpy() for the fill pattern repeatedly for multibyte patterns. So for a 4 byte pattern with 8k IO, it calls memcpy() 2048 times. Since there is already 512 bytes reserved for the pattern, I figured a simple solution was to use it. This patch replicates short patterns so they can be more efficiently copied. (Single byte patterns are left alone since they can make use of the much more efficient memset() call.) The result is a 10x performance improvement on pattern filling. (With this patch, it's still 3x slower than when it re-uses the already filled pattern.) Signed-off-by: Jens Axboe --- options.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/options.c b/options.c index f62ab6d5..8fb93ca7 100644 --- a/options.c +++ b/options.c @@ -689,12 +689,24 @@ static int str_verify_pattern_cb(void *data, const char *input) } } } + + /* + * Fill the pattern all the way to the end. This greatly reduces + * the number of memcpy's we have to do when verifying the IO. + */ + while (i > 1 && i * 2 <= MAX_PATTERN_SIZE) { + memcpy(&td->o.verify_pattern[i], &td->o.verify_pattern[0], i); + i *= 2; + } + td->o.verify_pattern_bytes = i; + /* * VERIFY_META could already be set */ if (td->o.verify == VERIFY_NONE) td->o.verify = VERIFY_PATTERN; + return 0; } -- 2.25.1