Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753889AbbBRUc1 (ORCPT ); Wed, 18 Feb 2015 15:32:27 -0500 Received: from mail.parknet.co.jp ([210.171.160.6]:41292 "EHLO mail.parknet.co.jp" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753718AbbBRUc0 (ORCPT ); Wed, 18 Feb 2015 15:32:26 -0500 From: OGAWA Hirofumi To: Alexander Kuleshov Cc: linux-kernel@vger.kernel.org Subject: Re: [PATCH] fs/fat: calculate checksum in a loop instead of directly calculating References: <1424285300-14431-1-git-send-email-kuleshovmail@gmail.com> <878ufvowcd.fsf@mail.parknet.co.jp> Date: Thu, 19 Feb 2015 05:32:20 +0900 In-Reply-To: (Alexander Kuleshov's message of "Thu, 19 Feb 2015 01:46:07 +0600") Message-ID: <87wq3fnep7.fsf@mail.parknet.co.jp> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/25.0.50 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2092 Lines: 93 Alexander Kuleshov writes: > time ./test_with_loop > > real 0m0.001s > user 0m0.000s > sys 0m0.001s > > And > > time ./test_direct_calculation: > > real 0m0.002s > user 0m0.000s > sys 0m0.001s Hm, #include #include #include typedef unsigned char __u8; typedef unsigned char u8; #if 1 static inline unsigned char fat_checksum(const __u8 *name) { unsigned char s = name[0]; s = (s<<7) + (s>>1) + name[1]; s = (s<<7) + (s>>1) + name[2]; s = (s<<7) + (s>>1) + name[3]; s = (s<<7) + (s>>1) + name[4]; s = (s<<7) + (s>>1) + name[5]; s = (s<<7) + (s>>1) + name[6]; s = (s<<7) + (s>>1) + name[7]; s = (s<<7) + (s>>1) + name[8]; s = (s<<7) + (s>>1) + name[9]; s = (s<<7) + (s>>1) + name[10]; return s; } #else static inline unsigned char fat_checksum(const __u8 *name) { unsigned char s = name[0]; u8 i; for (i = 1; i < 11; i++) s = (s << 7) + (s >> 1) + name[i]; return s; } #endif static __attribute__ ((noinline)) int test(unsigned char *name) { long i; for (i = 0; i < 100000000L; i++) name[i % 11] = fat_checksum(name); return name[0]; } int main(int argc, char *argv[]) { printf("%u\n", test((unsigned char *)argv[1])); return 0; } $ gcc --version gcc (Debian 4.9.1-19) 4.9.1 Copyright (C) 2014 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. $ gcc -O2 -o c.inline c.c # change #if 1 => #if 0 $ gcc -O2 -o c.loop c.c $ time ./c.inline aaaaaaaaaaa 14 real 0m0.550s user 0m0.548s sys 0m0.000s $ time ./c.loop aaaaaaaaaaa 14 real 0m0.901s user 0m0.896s sys 0m0.004s This is my environment only? (gcc (Debian 4.9.1-19) 4.9.1) -- OGAWA Hirofumi -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/