Java NIO FileChannel versus FileOutputstream performance / usefulness

My experience with larger files sizes has been that java.nio is faster than java.io. Solidly faster. Like in the >250% range. That said, I am eliminating obvious bottlenecks, which I suggest your micro-benchmark might suffer from. Potential areas for investigating: The buffer size. The algorithm you basically have is copy from disk to buffer copy … Read more

What is copy-on-write?

I was going to write up my own explanation but this Wikipedia article pretty much sums it up. Here is the basic concept: Copy-on-write (sometimes referred to as “COW”) is an optimization strategy used in computer programming. The fundamental idea is that if multiple callers ask for resources which are initially indistinguishable, you can give … Read more

Why is the shovel operator (

Proof: a=”foo” a.object_id #=> 2154889340 a << ‘bar’ a.object_id #=> 2154889340 a += ‘quux’ a.object_id #=> 2154742560 So << alters the original string rather than creating a new one. The reason for this is that in ruby a += b is syntactic shorthand for a = a + b (the same goes for the other … Read more

Can I hint the optimizer by giving the range of an integer?

Yes, it is possible. For example, for gcc you can use __builtin_unreachable to tell the compiler about impossible conditions, like so: if (value < 0 || value > 36) __builtin_unreachable(); We can wrap the condition above in a macro: #define assume(cond) do { if (!(cond)) __builtin_unreachable(); } while (0) And use it like so: assume(x … Read more

Meaning of acronym SSO in the context of std::string

Background / Overview Operations on automatic variables (“from the stack”, which are variables that you create without calling malloc / new) are generally much faster than those involving the free store (“the heap”, which are variables that are created using new). However, the size of automatic arrays is fixed at compile time, but the size … Read more

Why can lambdas be better optimized by the compiler than plain functions?

The reason is that lambdas are function objects so passing them to a function template will instantiate a new function specifically for that object. The compiler can thus trivially inline the lambda call. For functions, on the other hand, the old caveat applies: a function pointer gets passed to the function template, and compilers traditionally … Read more