GNU bug report logs -
#6524
du now uses less than half as much memory, sometimes
Previous Next
Reported by: Jim Meyering <jim <at> meyering.net>
Date: Sun, 27 Jun 2010 22:10:02 UTC
Severity: normal
Done: Jim Meyering <jim <at> meyering.net>
Bug is archived. No further changes may be made.
Full log
View this message in rfc822 format
Jim Meyering wrote:
...
> I prefer to use unsigned types when appropriate,
> and adjusted a couple of other things for readability.
> I'll push something like the following later today.
...
> Subject: [PATCH] di-set, ino-map: adjust a type, improve readability
...
> size_t h = dev;
> - int i;
> - for (i = 1; i < sizeof dev / sizeof h + (sizeof dev % sizeof h != 0); i++)
> + unsigned int i;
> + unsigned int n_words = sizeof ino / sizeof h + (sizeof ino % sizeof h != 0);
It'd be good if I were to compile before posting a patch ;-)
Those uses of "ino" should be "dev", of course.
From 8217117f3cb4ee39f8913fcfdef8b3d64dfd2437 Mon Sep 17 00:00:00 2001
From: Jim Meyering <meyering <at> redhat.com>
Date: Wed, 7 Jul 2010 11:57:26 +0200
Subject: [PATCH] di-set, ino-map: adjust a type, improve readability
* gl/lib/ino-map.c (ino_hash): Declare "i" as unsigned int.
Use an intermediate variable for the for-loop upper bound,
so it's a little more readable. Adjust comment.
* gl/lib/di-set.c (di_ent_hash): Likewise.
---
gl/lib/di-set.c | 10 ++++++----
gl/lib/ino-map.c | 10 ++++++----
2 files changed, 12 insertions(+), 8 deletions(-)
diff --git a/gl/lib/di-set.c b/gl/lib/di-set.c
index ba44bcf..892950d 100644
--- a/gl/lib/di-set.c
+++ b/gl/lib/di-set.c
@@ -78,11 +78,13 @@ di_ent_hash (void const *x, size_t table_size)
struct di_ent const *p = x;
dev_t dev = p->dev;
- /* Exclusive-OR the words of DEV into H. This avoids loss of info,
- without using a wider % that could be quite slow. */
+ /* When DEV is wider than size_t, exclusive-OR the words of DEV into H.
+ This avoids loss of info, without applying % to the wider type,
+ which could be quite slow on some systems. */
size_t h = dev;
- int i;
- for (i = 1; i < sizeof dev / sizeof h + (sizeof dev % sizeof h != 0); i++)
+ unsigned int i;
+ unsigned int n_words = sizeof dev / sizeof h + (sizeof dev % sizeof h != 0);
+ for (i = 1; i < n_words; i++)
h ^= dev >> CHAR_BIT * sizeof h * i;
return h % table_size;
diff --git a/gl/lib/ino-map.c b/gl/lib/ino-map.c
index cc9a131..f6fdd63 100644
--- a/gl/lib/ino-map.c
+++ b/gl/lib/ino-map.c
@@ -56,11 +56,13 @@ ino_hash (void const *x, size_t table_size)
struct ino_map_ent const *p = x;
ino_t ino = p->ino;
- /* Exclusive-OR the words of INO into H. This avoids loss of info,
- without using a wider % that could be quite slow. */
+ /* When INO is wider than size_t, exclusive-OR the words of INO into H.
+ This avoids loss of info, without applying % to the wider type,
+ which could be quite slow on some systems. */
size_t h = ino;
- int i;
- for (i = 1; i < sizeof ino / sizeof h + (sizeof ino % sizeof h != 0); i++)
+ unsigned int i;
+ unsigned int n_words = sizeof ino / sizeof h + (sizeof ino % sizeof h != 0);
+ for (i = 1; i < n_words; i++)
h ^= ino >> CHAR_BIT * sizeof h * i;
return h % table_size;
--
1.7.2.rc1.218.gca56a
This bug report was last modified 14 years and 99 days ago.
Previous Next
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.