diff options
| author | Simon Tatham <anakin@pobox.com> | 2005-07-22 11:06:57 +0000 |
|---|---|---|
| committer | Simon Tatham <anakin@pobox.com> | 2005-07-22 11:06:57 +0000 |
| commit | a605a17d05acf4d981219c5e8db3def0b67a5c4a (patch) | |
| tree | 9153cfc0f194159faf4d2dd050a5eb935971ecc2 | |
| parent | 6bce285027a9eacd50b92b5a26e1cd3c5c69a4ca (diff) | |
| download | puzzles-a605a17d05acf4d981219c5e8db3def0b67a5c4a.zip puzzles-a605a17d05acf4d981219c5e8db3def0b67a5c4a.tar.gz puzzles-a605a17d05acf4d981219c5e8db3def0b67a5c4a.tar.bz2 puzzles-a605a17d05acf4d981219c5e8db3def0b67a5c4a.tar.xz | |
James H profiled the new Same Game grid generator and discovered it
was spending 60% of its time in shuffle(). The purpose of the
shuffle() call was to go through a largish array in random order
until we found an element that worked, so there's no actual need to
shuffle the whole array every time and I only did it out of
laziness. So I now pick a random element each time I go round the
loop, meaning I save a lot of shuffling effort whenever the loop
terminates early (which is often). I get about a factor of two speed
improvement from this small change.
[originally from svn r6125]
| -rw-r--r-- | samegame.c | 15 |
1 files changed, 7 insertions, 8 deletions
@@ -398,11 +398,6 @@ static void gen_grid(int w, int h, int nc, int *grid, random_state *rs) if (n == 0) break; /* we're done */ - /* - * Shuffle the list. - */ - shuffle(list, n, sizeof(*list), rs); - #ifdef GENERATION_DIAGNOSTICS printf("initial grid:\n"); { @@ -420,13 +415,17 @@ static void gen_grid(int w, int h, int nc, int *grid, random_state *rs) #endif /* - * Now go through the list one element at a time and - * actually attempt to insert something there. + * Now go through the list one element at a time in + * random order, and actually attempt to insert + * something there. */ while (n-- > 0) { int dirs[4], ndirs, dir; - pos = list[n]; + i = random_upto(rs, n+1); + pos = list[i]; + list[i] = list[n]; + x = pos % w; y = pos / w; |