<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>Eli Bendersky's website - Hardware &amp; Gadgets</title><link href="https://eli.thegreenplace.net/" rel="alternate"></link><link href="https://eli.thegreenplace.net/feeds/hardware-gadgets.atom.xml" rel="self"></link><id>https://eli.thegreenplace.net/</id><updated>2024-11-02T13:43:25-07:00</updated><entry><title>Replacing my home desktop computer</title><link href="https://eli.thegreenplace.net/2022/replacing-my-home-desktop-computer/" rel="alternate"></link><published>2022-11-02T20:31:00-07:00</published><updated>2024-11-02T13:43:25-07:00</updated><author><name>Eli Bendersky</name></author><id>tag:eli.thegreenplace.net,2022-11-02:/2022/replacing-my-home-desktop-computer/</id><summary type="html">&lt;p&gt;After 9 years, it's time to retire my &lt;a class="reference external" href="https://eli.thegreenplace.net/2013/11/23/a-new-ubuntu-machine-for-home/"&gt;old and faithful home Linux machine&lt;/a&gt;. It
has served me extremely well, by far the longest time I've used a home computer
without any replacements. The fans were starting to show their age, to the
extent that the CPU fan sometimes needs …&lt;/p&gt;</summary><content type="html">&lt;p&gt;After 9 years, it's time to retire my &lt;a class="reference external" href="https://eli.thegreenplace.net/2013/11/23/a-new-ubuntu-machine-for-home/"&gt;old and faithful home Linux machine&lt;/a&gt;. It
has served me extremely well, by far the longest time I've used a home computer
without any replacements. The fans were starting to show their age, to the
extent that the CPU fan sometimes needs a nudge to start after the machine has
been off. While this can be fixed, I also wanted a somewhat faster machine with
more memory.&lt;/p&gt;
&lt;p&gt;I've long been keeping a curious eye on &lt;a class="reference external" href="https://system76.com/"&gt;system76&lt;/a&gt;;
they build and sell HW that was designed for Linux from the start. While my
old machine - which was just a custom build - handled Linux fine over the years,
it did exhibit some snags here and there (Bluetooth, for example). It would be
nice not to deal with this and have HW that &lt;em&gt;just works&lt;/em&gt;.&lt;/p&gt;
&lt;img alt="System76 meerkat machine" class="align-center" src="https://eli.thegreenplace.net/images/2022/meerkat.webp" style="width: 400px;" /&gt;
&lt;p&gt;So I went ahead and ordered a &amp;quot;Meerkat&amp;quot; model, which is a really tiny 4.5&amp;quot;x4.5&amp;quot;
box (with a comically large power adapter) that manages to pack 32 GiB of
memory, a sizable SSD and a 4-core (8-thread) i5-1135G7 CPU. It came with
Ubuntu 22.04 preinstalled and was very quick and easy to set up. I
moved all my daily operations to this machine a couple of hours after unpacking
it. Just the computer itself changed - it's still the same monitor, keyboard
and mouse. I could finally use my Bluetooth earphones with it, without any
issues.&lt;/p&gt;
&lt;p&gt;It's about 33% faster than my older machine (at least for compiling the Go
toolchain and medium-sized Rust projects), and it's nice to have twice as much
memory and a larger SSD. I'm quite happy with it so far. It's not
the cheapest option out there, but it &lt;em&gt;is&lt;/em&gt; a &amp;quot;pay for high quality with minimum
fuss&amp;quot; option.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update 2024.11.02&lt;/strong&gt;: I replaced this computer after two years. It's still
working great, but was becoming a bit underpowered for my needs, especially
because it lacks a GPU. Being pretty happy with System76, I went for a &lt;a class="reference external" href="https://system76.com/desktops/thelio-mira"&gt;Thelio Mira&lt;/a&gt;
with an i7-13700K CPI (16 Cores - 24 Threads 8P+8E), 64 GiB of memory and
an inexpensive gaming-class Nvidia GPU.&lt;/p&gt;
</content><category term="misc"></category><category term="Hardware &amp; Gadgets"></category><category term="Linux"></category></entry><entry><title>Intel i7 loop performance anomaly</title><link href="https://eli.thegreenplace.net/2013/12/03/intel-i7-loop-performance-anomaly" rel="alternate"></link><published>2013-12-03T07:18:48-08:00</published><updated>2022-10-04T14:08:24-07:00</updated><author><name>Eli Bendersky</name></author><id>tag:eli.thegreenplace.net,2013-12-03:/2013/12/03/intel-i7-loop-performance-anomaly</id><summary type="html">
        &lt;p&gt;Recently I've been doing some benchmarking and came upon a very surprising behavior from a number of different Intel i7 CPUs (it manifests on Sandy Bridge and Haswell desktop-class CPUs as well as Sandy Bridge-EP Xeon CPUs).&lt;/p&gt;
&lt;p&gt;The benchmark is very simple and the result is... bizarre. Perhaps one of …&lt;/p&gt;</summary><content type="html">
        &lt;p&gt;Recently I've been doing some benchmarking and came upon a very surprising behavior from a number of different Intel i7 CPUs (it manifests on Sandy Bridge and Haswell desktop-class CPUs as well as Sandy Bridge-EP Xeon CPUs).&lt;/p&gt;
&lt;p&gt;The benchmark is very simple and the result is... bizarre. Perhaps one of the readers of my blog knows what's going on here. Here's the C code for the benchmark (full code with a makefile is available in &lt;a class="reference external" href="https://gist.github.com/eliben/7770377"&gt;this Gist&lt;/a&gt;):&lt;/p&gt;
&lt;div class="highlight" style="background: #ffffff"&gt;&lt;pre style="line-height: 125%"&gt;&lt;span style="color: #00007f; font-weight: bold"&gt;const&lt;/span&gt; &lt;span style="color: #00007f; font-weight: bold"&gt;unsigned&lt;/span&gt; N = &lt;span style="color: #007f7f"&gt;400&lt;/span&gt; * &lt;span style="color: #007f7f"&gt;1000&lt;/span&gt; * &lt;span style="color: #007f7f"&gt;1000&lt;/span&gt;;

&lt;span style="color: #00007f; font-weight: bold"&gt;volatile&lt;/span&gt; &lt;span style="color: #00007f; font-weight: bold"&gt;unsigned&lt;/span&gt; &lt;span style="color: #00007f; font-weight: bold"&gt;long&lt;/span&gt; &lt;span style="color: #00007f; font-weight: bold"&gt;long&lt;/span&gt; counter = &lt;span style="color: #007f7f"&gt;0&lt;/span&gt;;

&lt;span style="color: #007f00"&gt;// Don&amp;#39;t inline the benchmarking code into main&lt;/span&gt;
&lt;span style="color: #00007f; font-weight: bold"&gt;void&lt;/span&gt; __attribute__((noinline)) tightloop();
&lt;span style="color: #00007f; font-weight: bold"&gt;void&lt;/span&gt; __attribute__((noinline)) loop_with_extra_call();

&lt;span style="color: #00007f; font-weight: bold"&gt;void&lt;/span&gt; &lt;span style="color: #00007f"&gt;tightloop&lt;/span&gt;() {
  &lt;span style="color: #00007f; font-weight: bold"&gt;unsigned&lt;/span&gt; j;
  &lt;span style="color: #00007f; font-weight: bold"&gt;for&lt;/span&gt; (j = &lt;span style="color: #007f7f"&gt;0&lt;/span&gt;; j &amp;lt; N; ++j) {
    counter += j;
  }
}

&lt;span style="color: #00007f; font-weight: bold"&gt;void&lt;/span&gt; &lt;span style="color: #00007f"&gt;foo&lt;/span&gt;() {
}

&lt;span style="color: #00007f; font-weight: bold"&gt;void&lt;/span&gt; &lt;span style="color: #00007f"&gt;loop_with_extra_call&lt;/span&gt;() {
  &lt;span style="color: #00007f; font-weight: bold"&gt;unsigned&lt;/span&gt; j;
  &lt;span style="color: #00007f; font-weight: bold"&gt;for&lt;/span&gt; (j = &lt;span style="color: #007f7f"&gt;0&lt;/span&gt;; j &amp;lt; N; ++j) {
    __asm__(&lt;span style="color: #7f007f"&gt;&amp;quot;call foo&amp;quot;&lt;/span&gt;);
    counter += j;
  }
}
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;We're benchmarking &lt;tt class="docutils literal"&gt;tightloop&lt;/tt&gt; vs. &lt;tt class="docutils literal"&gt;loop_with_extra_call&lt;/tt&gt;, which does exactly the same thing (increment a &lt;tt class="docutils literal"&gt;volatile&lt;/tt&gt; counter) but has a dummy call to a do-nothing function in the middle. I don't think anyone has doubts about how this should behave, right? How much slower do you think the extra call will make this loop? Twice as slow? 10% slower?&lt;/p&gt;
&lt;p&gt;Here's the driving &lt;tt class="docutils literal"&gt;main&lt;/tt&gt; function:&lt;/p&gt;
&lt;div class="highlight" style="background: #ffffff"&gt;&lt;pre style="line-height: 125%"&gt;&lt;span style="color: #00007f; font-weight: bold"&gt;int&lt;/span&gt; &lt;span style="color: #00007f"&gt;main&lt;/span&gt;(&lt;span style="color: #00007f; font-weight: bold"&gt;int&lt;/span&gt; argc, &lt;span style="color: #00007f; font-weight: bold"&gt;char&lt;/span&gt;** argv) {
  &lt;span style="color: #00007f; font-weight: bold"&gt;if&lt;/span&gt; (argc &amp;lt;= &lt;span style="color: #007f7f"&gt;1&lt;/span&gt;) {
    &lt;span style="color: #00007f; font-weight: bold"&gt;return&lt;/span&gt; &lt;span style="color: #007f7f"&gt;1&lt;/span&gt;;
  }

  &lt;span style="color: #00007f; font-weight: bold"&gt;if&lt;/span&gt; (argv[&lt;span style="color: #007f7f"&gt;1&lt;/span&gt;][&lt;span style="color: #007f7f"&gt;0&lt;/span&gt;] == &lt;span style="color: #7f007f"&gt;&amp;#39;t&amp;#39;&lt;/span&gt;) {
    tightloop();
  } &lt;span style="color: #00007f; font-weight: bold"&gt;else&lt;/span&gt; &lt;span style="color: #00007f; font-weight: bold"&gt;if&lt;/span&gt; (argv[&lt;span style="color: #007f7f"&gt;1&lt;/span&gt;][&lt;span style="color: #007f7f"&gt;0&lt;/span&gt;] == &lt;span style="color: #7f007f"&gt;&amp;#39;c&amp;#39;&lt;/span&gt;) {
    loop_with_extra_call();
  }

  &lt;span style="color: #00007f; font-weight: bold"&gt;return&lt;/span&gt; &lt;span style="color: #007f7f"&gt;0&lt;/span&gt;;
}
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Building the code with gcc version 4.8 (same output code is produced by 4.6, as well as when replacing &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;-O2&lt;/span&gt;&lt;/tt&gt; by &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;-O3&lt;/span&gt;&lt;/tt&gt;):&lt;/p&gt;
&lt;div class="highlight" style="background: #ffffff"&gt;&lt;pre style="line-height: 125%"&gt;$ gcc -O2 loop-call-weirdness.c -o build/loop-call-weirdness
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now I'll run it on my Intel i7-4771 (Haswell) CPU. First run the version with &lt;tt class="docutils literal"&gt;tightloop&lt;/tt&gt;:&lt;/p&gt;
&lt;div class="highlight" style="background: #ffffff"&gt;&lt;pre style="line-height: 125%"&gt;$ perf stat -r 10 -e cycles,instructions  build/loop-call-weirdness t

 Performance counter stats for &amp;#39;build/loop-call-weirdness t&amp;#39; (10 runs):

     2,659,506,002 cycles       #    0.000 GHz              ( +-  0.19% )
     2,401,144,539 instructions #    0.90  insns per cycle  ( +-  0.00% )

       0.685642994 seconds time elapsed                     ( +-  0.24% )
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;... and with the extra call:&lt;/p&gt;
&lt;div class="highlight" style="background: #ffffff"&gt;&lt;pre style="line-height: 125%"&gt;$ perf stat -r 10 -e cycles,instructions  build/loop-call-weirdness c

 Performance counter stats for &amp;#39;build/loop-call-weirdness c&amp;#39; (10 runs):

     2,336,765,798 cycles       #    0.000 GHz              ( +-  0.34% )
     3,201,055,823 instructions #    1.37  insns per cycle  ( +-  0.00% )

       0.602387097 seconds time elapsed                     ( +-  0.39% )
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Yes, the extra call makes the code &lt;strong&gt;faster&lt;/strong&gt;! You didn't expect that, did you.&lt;/p&gt;
&lt;p&gt;Looking at the disassembly, the compiler is doing fine here, producing quite expected code:&lt;/p&gt;
&lt;div class="highlight" style="background: #ffffff"&gt;&lt;pre style="line-height: 125%"&gt;0000000000400530 &amp;lt;tightloop&amp;gt;:
  400530:     xor    %eax,%eax
  400532:     nopw   0x0(%rax,%rax,1)
  400538:     mov    0x200b01(%rip),%rdx        # 601040 &amp;lt;counter&amp;gt;
  40053f:     add    %rax,%rdx
  400542:     add    $0x1,%rax
  400546:     cmp    $0x17d78400,%rax
  40054c:     mov    %rdx,0x200aed(%rip)        # 601040 &amp;lt;counter&amp;gt;
  400553:     jne    400538 &amp;lt;tightloop+0x8&amp;gt;
  400555:     repz retq
  400557:     nopw   0x0(%rax,%rax,1)

0000000000400560 &amp;lt;foo&amp;gt;:
  400560:     repz retq

0000000000400570 &amp;lt;loop_with_extra_call&amp;gt;:
  400570:     xor    %eax,%eax
  400572:     nopw   0x0(%rax,%rax,1)
  400578:     callq  400560 &amp;lt;foo&amp;gt;
  40057d:     mov    0x200abc(%rip),%rdx        # 601040 &amp;lt;counter&amp;gt;
  400584:     add    %rax,%rdx
  400587:     add    $0x1,%rax
  40058b:     cmp    $0x17d78400,%rax
  400591:     mov    %rdx,0x200aa8(%rip)        # 601040 &amp;lt;counter&amp;gt;
  400598:     jne    400578 &amp;lt;loop_with_extra_call+0x8&amp;gt;
  40059a:     repz retq
  40059c:     nopl   0x0(%rax)
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Note that the &lt;tt class="docutils literal"&gt;volatile&lt;/tt&gt; is key here, since it forces the compiler to produce a load and store from the global on each iteration. Without &lt;tt class="docutils literal"&gt;volatile&lt;/tt&gt;, the benchmark behaves normally (the extra call makes it significantly slower).&lt;/p&gt;
&lt;p&gt;It's easy to see that &lt;tt class="docutils literal"&gt;tightloop&lt;/tt&gt; runs 6 instructions per iteration, which computes with the numbers reported by &lt;tt class="docutils literal"&gt;perf&lt;/tt&gt; (400 million iterations, times 6 instructions, is 2.4 billion instructions). &lt;tt class="docutils literal"&gt;loop_with_extra_call&lt;/tt&gt; adds two more instructions per iteration (the &lt;tt class="docutils literal"&gt;call&lt;/tt&gt; to &lt;tt class="docutils literal"&gt;foo&lt;/tt&gt; and the &lt;tt class="docutils literal"&gt;ret&lt;/tt&gt; from it), and that also corresponds to the performance numbers.&lt;/p&gt;
&lt;p&gt;That's right, even though the version with the extra call executes 33% more instructions, it manages to do it quicker.&lt;/p&gt;
&lt;p&gt;Unfortunately, my fast Haswell CPU (or the Linux kernel coming with Ubuntu 13.10) doesn't support the whole range of &lt;tt class="docutils literal"&gt;perf stat&lt;/tt&gt; counters, but running on an older CPU (where the anomaly also exists though the performance difference in smaller), I see that the &lt;tt class="docutils literal"&gt;tightloop&lt;/tt&gt; benchmark has a lot of frontend and backend stalls (mostly frontend), for a total of 0.92 stalled cycles per instruction. The version with the extra call has just 0.25 stalled cycles per instruction.&lt;/p&gt;
&lt;p&gt;So would it be right to assume that the tight loop stalls on loading from &lt;tt class="docutils literal"&gt;counter&lt;/tt&gt; because the rest of the instructions in the loop depend on its value? So how does the &lt;tt class="docutils literal"&gt;call&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;ret&lt;/tt&gt; help here? By providing non-data-dependent instructions that can be run in parallel while the others are stalled? Still, whatever that is, I find this result astonishing.&lt;/p&gt;
&lt;p&gt;Let me know if you have any insights.&lt;/p&gt;

    </content><category term="misc"></category><category term="Assembly"></category><category term="C &amp; C++"></category><category term="Hardware &amp; Gadgets"></category><category term="Linux"></category></entry><entry><title>A new Ubuntu machine for home</title><link href="https://eli.thegreenplace.net/2013/11/23/a-new-ubuntu-machine-for-home" rel="alternate"></link><published>2013-11-23T14:29:13-08:00</published><updated>2022-11-03T03:33:21-07:00</updated><author><name>Eli Bendersky</name></author><id>tag:eli.thegreenplace.net,2013-11-23:/2013/11/23/a-new-ubuntu-machine-for-home</id><summary type="html">
&lt;p&gt;
&lt;b&gt;Update (2022-11-02):&lt;/b&gt; 9 years later, this machine &lt;a href="https://eli.thegreenplace.net/2022/replacing-my-home-desktop-computer/"&gt;has been replaced&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;This week I got a new machine for my home workstation. My previous machine was a 3.5-year old Asus laptop running Ubuntu 12.04; while the laptop is relatively powerful (Sandy Bridge i7 2820QM CPU), there were a couple …&lt;/p&gt;</summary><content type="html">
&lt;p&gt;
&lt;b&gt;Update (2022-11-02):&lt;/b&gt; 9 years later, this machine &lt;a href="https://eli.thegreenplace.net/2022/replacing-my-home-desktop-computer/"&gt;has been replaced&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;This week I got a new machine for my home workstation. My previous machine was a 3.5-year old Asus laptop running Ubuntu 12.04; while the laptop is relatively powerful (Sandy Bridge i7 2820QM CPU), there were a couple of problems that prompted me to upgrade:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;I really wanted to use a high-resolution (WQHD - 2560x1440) screen at home, and the laptop's graphics card (integrated Intel Sandy Bridge graphics) isn't up to the task (its maximal resolution support is 2048x1152).&lt;/li&gt;
&lt;li&gt;It was starting to become sluggish for large tasks mainly due to having just 4 GB of memory. For example, I couldn't really run a full LLVM &amp;amp; Clang build with parallelism because linking would take the whole physical memory and the machine would start thrashing. Building LLVM &amp;amp; Clang in a single thread is unbearably slow (above an hour), and splitting the compilation &amp;amp; linkage is cumbersome &lt;em&gt;and&lt;/em&gt; slow.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;So after some online research I settled on the following setup. Since I really only use this machine at home when sitting behind my desk, I got a desktop because these are cheaper to upgrade, can house more powerful hardware and I didn't really need any laptop features in it.&lt;/p&gt;
&lt;div class="section" id="screen"&gt;
&lt;h3&gt;Screen&lt;/h3&gt;
&lt;p&gt;Starting with the crown jewel - a Viewsonic VP2770-LED screen. A stunning 27&amp;quot; with 2560x1440 resolution. I got this one before the new hardware, so I could verify that indeed my old laptop can't push the full resolution to it.&lt;/p&gt;
&lt;img class="align-center" src="https://eli.thegreenplace.net/images/2013/11/monitor-cropped.png" /&gt;
&lt;p&gt;This monitor can run in full resolution only from a DP (Display Port) connector or DVI. This was an important consideration in choosing a motherboard.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="cpu-memory-motherboard"&gt;
&lt;h3&gt;CPU, memory, motherboard&lt;/h3&gt;
&lt;p&gt;Relatively high-end Haswell i7-4771 CPU, with 4 cores / 8 threads at 3.5GHz and 8MB of cache. Crucially, it comes with the Intel HD Graphics 4600 on board, which can support WQHD resolution. There's a catch, though. It only supports such resolution with DP or HDMI. Note - not DVI, so the intersection of GPU and monitor leave only DP as a viable option.&lt;/p&gt;
&lt;p&gt;For memory, I got 16GB of Corsair Vengeance DDR3. 16GB should be plenty for now.&lt;/p&gt;
&lt;p&gt;Motherboard - the main consideration, as mentioned above, is to have a DP output. This is why I got the Asus Q87M, which is a bit higher-end than the minimal motherboard I could get for my setup. It has DP output as well as a bunch of other goodies like two USB 3.0 ports.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="storage"&gt;
&lt;h3&gt;Storage&lt;/h3&gt;
&lt;p&gt;Another minor reason for the upgrade was to move on from a magnetic disk to SSD. For this new setup I got a 250GB Samsung 840 EVO SSD. I was pondering the size I need, but really for anything above the 100-200GB mark that would probably be backup data so I could use my external HDD to supplement that. On the laptop this system is replacing I never went above 200GB total.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="miscellanea"&gt;
&lt;h3&gt;Miscellanea&lt;/h3&gt;
&lt;p&gt;Since I don't have a discrete GPU and the Haswell CPUs are not overly power-hungry, I could get by with a small power supply. So I got a good, quiet Antec 380W supply. As for the case, one of the simpler CoolerMaster ones that promised to be quiet (and indeed it is).&lt;/p&gt;
&lt;p&gt;That's it! In 2013 there are no floppy drives, CD/DVD drives, sound cards, external network cards and a bunch of other crud we used to shove into our desktops just a few short years ago. Since my setup uses Intel's integrated graphics, it's super minimal - there are no PCI cards on the motherboard at all.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="software"&gt;
&lt;h3&gt;Software&lt;/h3&gt;
&lt;p&gt;After a very short consideration I went for the latest and greatest Ubuntu - 13.10.&lt;/p&gt;
&lt;p&gt;I'm very impressed with how quick and easy it is to install an Ubuntu desktop these days. It takes considerably less time and effort than it took to install Windows XP, say a couple of years ago. Part of that can be attributed to the speed of the system (the SSD is smoking fast - Ubuntu installed in just a few minutes), lack of external hardware and other stuff. But all in all, it's a pleasant experience to have a quick setup where everything (including the fancy WQHD monitor on a DP connection) just works with almost no tweaking. I was planning to spend the whole weekend on setting this thing up, and ended up doing it in just a couple of hours spread over week-day evenings and mornings.&lt;/p&gt;
&lt;p&gt;And of course, one of my favorite parts of the Ubuntu experience is that all the software you need is just a &lt;tt class="docutils literal"&gt;sudo &lt;span class="pre"&gt;apt-get&lt;/span&gt;&lt;/tt&gt; away. In addition, many desktop programs (like Dropbox and Chrome) just let you download &lt;tt class="docutils literal"&gt;.deb&lt;/tt&gt; files and install them.&lt;/p&gt;
&lt;p&gt;Online support is so much better these days, thanks to Google and Ask Ubuntu. To answer any question (how do I make the mouse faster? what's a good graphical program to show detailed hardware information?), just type it into Google with &amp;quot;ubuntu 13.10&amp;quot; attached and in all likeness the answer is a couple of clicks away. For me, Ubuntu/Linux has been OS of choice of years, but even for the more general public I could agree that &lt;a class="reference external" href="http://www.zdnet.com/intel-the-year-of-the-linux-desktop-is-here-7000020849/"&gt;2013 is the year of the Linux desktop&lt;/a&gt;, based on my experience. Really, I should probably go order something from Ubuntu's overpriced gift shop just to contribute back :-)&lt;/p&gt;
&lt;p&gt;Finally, I can't overestimate the convenience of having all your configuration (&amp;quot;dot-files&amp;quot;) in a Git repository so making your system behave just like you other systems is only a &lt;tt class="docutils literal"&gt;git pull&lt;/tt&gt; and a few soft links away.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="performance"&gt;
&lt;h3&gt;Performance&lt;/h3&gt;
&lt;p&gt;A couple of years ago when LLVM &amp;amp; Clang were much smaller and could still link successfully on my laptop, it took me about 15 minutes for a full build. Today I built them on the new machine in under 10 minutes (9:35) - which is impressive, given how much they grew in these two years. The peak memory usage (with &lt;tt class="docutils literal"&gt;make &lt;span class="pre"&gt;-j8&lt;/span&gt;&lt;/tt&gt;) climbed to over 6GB, which aligns with my observations of thrashing on the laptop. The full regression suite (&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;check-all&lt;/span&gt;&lt;/tt&gt;) runs in 1:33 minutes, which is pretty good.&lt;/p&gt;
&lt;p&gt;CPython builds 40% faster (0:51 vs. 1:30); its full test suite runs 35% faster (1:23 vs. 2:06).&lt;/p&gt;
&lt;p&gt;Node.js builds more than twice as fast (0:46 vs. 1:51).&lt;/p&gt;
&lt;p&gt;That's about all the benchmarking I intend to do because that's what I ultimately care about - compiling stuff and running tests - for large projects, quickly in parallel.&lt;/p&gt;
&lt;p&gt;The SSD adds a lot of snappiness to the system. It boots up very quickly, everything responds immediately. &lt;tt class="docutils literal"&gt;pss&lt;/tt&gt; / &lt;tt class="docutils literal"&gt;grep&lt;/tt&gt; searches are super-fast. It's a great new age where HDDs with their horrible seek times can be placed on the shelves of history.&lt;/p&gt;
&lt;/div&gt;

    </content><category term="misc"></category><category term="Hardware &amp; Gadgets"></category><category term="Linux"></category></entry><entry><title>New toys</title><link href="https://eli.thegreenplace.net/2012/05/19/new-toys" rel="alternate"></link><published>2012-05-19T13:51:41-07:00</published><updated>2022-10-04T14:08:24-07:00</updated><author><name>Eli Bendersky</name></author><id>tag:eli.thegreenplace.net,2012-05-19:/2012/05/19/new-toys</id><summary type="html">
      &lt;p&gt;
I got a couple of new gadgets/toys recently.
      &lt;/p&gt;&lt;p&gt;

The new iPad - white, 16GB wifi version. It's really sleek - lighter and slimmer
than my old iPad (first generation). The branding is confusing, why didn't they
just call it iPad 3? The screen is great, but I wonder what would be …&lt;/p&gt;</summary><content type="html">
      &lt;p&gt;
I got a couple of new gadgets/toys recently.
      &lt;/p&gt;&lt;p&gt;

The new iPad - white, 16GB wifi version. It's really sleek - lighter and slimmer
than my old iPad (first generation). The branding is confusing, why didn't they
just call it iPad 3? The screen is great, but I wonder what would be the killer
application to really let it shine? HD movies? Because when just viewing
photographs and browsing, there isn't too much difference from the old one's
screen.
      &lt;/p&gt;&lt;p&gt;

Kindle touch. I already have a "normal" kindle (also from the new generation),
but it's so useful in our family that I wanted another one. This time I bought a
touch screen version thinking that it should make dictionary translations easier
(for reading in Spanish, etc). I like its controls, but it's somewhat fatter and
heavier than the normal Kindle which makes it less convenient for holding. I
hope it's not a big difference when I'm actually used to it.
      &lt;/p&gt;
    </content><category term="misc"></category><category term="Hardware &amp; Gadgets"></category></entry><entry><title>Read It Later - first application bought for my iPad</title><link href="https://eli.thegreenplace.net/2010/12/25/read-it-later-first-application-bought-for-my-ipad" rel="alternate"></link><published>2010-12-25T10:28:51-08:00</published><updated>2022-10-20T03:29:22-07:00</updated><author><name>Eli Bendersky</name></author><id>tag:eli.thegreenplace.net,2010-12-25:/2010/12/25/read-it-later-first-application-bought-for-my-ipad</id><summary type="html">
      &lt;p&gt;
Being a frequent visitor of link-aggregation sites like &lt;a href="http://www.reddit.com/r/programming/"&gt;Proggit&lt;/a&gt; and &lt;a href="http://news.ycombinator.com/"&gt;HN&lt;/a&gt;, I frequently find myself bookmarking interesting articles for "future read". Previously, I used Xmarks, and later Firefox sync, for keeping these bookmarks synced across machines (I use at least 3 different regularly).
      &lt;/p&gt;&lt;p&gt;

However, with an iPad joining my arsenal …&lt;/p&gt;</summary><content type="html">
      &lt;p&gt;
Being a frequent visitor of link-aggregation sites like &lt;a href="http://www.reddit.com/r/programming/"&gt;Proggit&lt;/a&gt; and &lt;a href="http://news.ycombinator.com/"&gt;HN&lt;/a&gt;, I frequently find myself bookmarking interesting articles for "future read". Previously, I used Xmarks, and later Firefox sync, for keeping these bookmarks synced across machines (I use at least 3 different regularly).
      &lt;/p&gt;&lt;p&gt;

However, with an iPad joining my arsenal of geeky gadgets, I had to find a more complete solution. An iPad is wonderful for reading articles "later" on the couch, reducing total time spent staring at a real computer screen. 
      &lt;/p&gt;&lt;p&gt;

After some looking around, I came upon &lt;a href="http://readitlaterlist.com/"&gt;Read It Later&lt;/a&gt; - which is a set of tools designed exactly for what I need. 
      &lt;/p&gt;&lt;p&gt;

&lt;img src="https://eli.thegreenplace.net/images/2010/12/ril_logo.png" title="Read It Later logo" width="208" height="182" class="aligncenter size-full wp-image-2359" /&gt;

      &lt;/p&gt;&lt;p&gt;
Read It Later (RIL) allows me to do the following:
      &lt;/p&gt;&lt;p&gt;

&lt;ul&gt;
	&lt;li&gt;With a Firefox plugin, I can now save any article I want to read for future reference with a simple keyboard shortcut. Naturally, this article will be available on all computers for which I installed RIL and synced with my account.&lt;/li&gt;
	&lt;li&gt;An iPad app allows me to immediately be able to read this article on my iPad - &lt;em&gt;even offline&lt;/em&gt;.&lt;/li&gt;
	&lt;li&gt;A bookmarklet for iPad's Safari browser allows me to save articles to read later &lt;em&gt;from&lt;/em&gt; the iPad as well.&lt;/li&gt;
&lt;/ul&gt;

      &lt;/p&gt;&lt;p&gt;
I played with the free version of the app for a couple of weeks just to make sure that's what I need and then bought the full version. I'm not sure that the full version gives me real benefits over the free one, but it was cheap ($3) and I wanted to have a way to thank the author of RIL for his excellent work.
      &lt;/p&gt;



    </content><category term="misc"></category><category term="Hardware &amp; Gadgets"></category><category term="Software &amp; Tools"></category></entry></feed>