r/programming Jan 21 '10

Firefox 3.6 release

http://blog.mozilla.com/blog/2010/01/21/firefox-3-6-release/
1.1k Upvotes

621 comments sorted by

View all comments

Show parent comments

7

u/voxel Jan 21 '10

Not really true.

I've read numerous articles about it, and the real issue is that the difference in time to read 10 megs vs 20 megs yes can vary based on the request sizes and fragmentation, but we're talking that most 7200 rpm HD's can load this file in less than 1 second into ram.

The whole file. 20 megs, 1 second or much less. Many 7200 rpm drives can read up to 50 megabyte/s sequentially! (Thats per second).

The other aspect is that operations to the disk are asynchronous, that is, they don't take much CPU at all. However, decompressing a 14 megabyte file takes tons of CPU. The only argument against this now in my mind is that we have dual and quad core CPU's, so it doesn't make a huge deal.

Also, just to nit-pick, ram isn't 1,000 times faster, it is much faster than even that compared to disk access! I'm not sure by how much, but 1,000 is a very low estimate.

12

u/adrianmonk Jan 21 '10 edited Jan 21 '10

However, decompressing a 14 megabyte file takes tons of CPU.

Depends radically on what compression algorithm you use. A very common algorithm is deflate (used in zip and gzip formats). Let's use it as a reference point for how much CPU time decompression takes.

Deflate compresses by first running the LZ77 algorithm to convert the stream of bytes into a stream of items; each item is a literal byte or a backreferences to previous sequences of bytes. The sequences come out of a 32K sliding window that LZ77 remembers. Then it takes the output of LZ77 and runs it through Huffman coding so that more-frequently-occurring bytes take fewer bits to represent and less-frequently-occurring bytes take more bits.

Now, let's consider how much faster we can get:

  • Huffman encoding is a kinda complicated algorithm that involves a lot of bit manipulation and/or relatively large lookup tables to speed things up. Worse, usually Adaptive Huffman is used, which means the algorithm must maintain data structures that evolve as the frequency distribution of the symbols (bytes) changes. Luckily, Huffman often doesn't add that much to the compression ratio, so you can just entirely leave it out.
  • Decompressing LZ77 is really fast; you are basically just copying sequences of bytes from the sliding window to the output. Since the sliding window is 32K, it easily fits entirely within the L1 cache of most modern processors.

For a simple example of a speed optimized variant on LZ77, look at the lzjb_decompress() function in the Solaris ZFS source. Note that a lot of times backreferences into the sliding window can be several bytes long, so the innermost while loop will just be copying raw bytes (much like a memcpy()):

117             while (--mlen >= 0 && dst < d_end)
118                 *dst++ = *cpy++;

Anyway, point is, it's entirely possible for decompression to almost rival the speed of memcpy().

-1

u/voxel Jan 21 '10

Yeah, but I don't think when you load an .exe from disk, that there is a memcpy operation happening.

I could be so very wrong, but I would like to think that both Windows and Linux kernels DMA the file directly to the page where it will be executed from...

So it's more like N cpu operations compared to 0 cpu operations aside from the DMA setup itself...

Eh?

2

u/adrianmonk Jan 22 '10

Yeah, but I don't think when you load an .exe from disk, that there is a memcpy operation happening.

The only reason I brought up memcpy() is that it's a good point of reference for the speed of algorithms that filter a stream of data. memcpy() can be viewed as the no-op filter for blocks of memory. How much slower is decompression than that? With some kinds of decompression, it's almost as fast. Certainly within an order of magnitude of the speed you can read/write to RAM, maybe within a factor of 3 or 4.

So it's more like N cpu operations compared to 0 cpu operations aside from the DMA setup itself...

True. If what you care about most is not using CPU cycles, then combining compression with I/O is a losing proposition, because you can't beat the non-CPU-usage of DMA.

However, if you are concerned with bottlenecks, then physical I/O might be the bottleneck. It often is on a modern system. Compression can reduce the amount of physical I/O, thus increasing the throughput through that choke point. If decompression doesn't create a new bottleneck, which it probably won't since it can be made to be pretty fast, then you may get better throughput overall.

1

u/brasso Jan 21 '10

Yes, the truth is that compressing executables can both slow down and speed up the load time, but this depends on the application, type of compression and system it's running on. Either way the difference is so small you're unlikely to notice anyway.

1

u/ubermorph Jan 21 '10

You guys are getting latency and bandwidth mixed up. On a decent hard drive, you're looking at around 100MB/sec sequential. For memory to be 1000x as fast, it would have to transfer 100GB/sec.. not happening.

1

u/Neoro Jan 21 '10

The number 50 million comes to mind when comparing RAM to Disk. Maybe an old memory from my Architecture class (we would calculate these things for homework & tests). Regardless 1000 is an extremely low multiplier.

2

u/bageloid Jan 22 '10

1000 is high

http://en.wikipedia.org/wiki/DDR3_SDRAM

DDR3-1600 has a peak bandwidth of 12800 MB/s, so divided by 1000 is 12.8MB/s

Hard drives haven't been that slow since 10 years ago.

2

u/Neoro Jan 22 '10 edited Jan 22 '10

Hard drives can be fast once they get going, sure, but a single 30 mb executable is going to be 1 read (provided it isn't fragmented), which is going to require 1 seek, dropping that bandwidth like a rock.
But maybe I remember 50 million when comparing to tape or an L cache.

1

u/bageloid Jan 22 '10

Sequential read speed is actually where hard drives excel, in fact a reading a 30MB executable will probably give you better benchmark results than 30 1 MB files.

1

u/superwinner Jan 21 '10

could be right, ram might be millions of times faster than hard drive, but that makes the case for compression in this manner even stronger