diff --git a/tests/encperf.cxx b/tests/encperf.cxx
index 60905c8..b3c4f5d 100644
--- a/tests/encperf.cxx
+++ b/tests/encperf.cxx
@@ -1,15 +1,15 @@
 /* Copyright 2015 Pierre Ossman <ossman@cendio.se> for Cendio AB
- * 
+ *
  * This is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
  * (at your option) any later version.
- * 
+ *
  * This software is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU General Public License
  * along with this software; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,
@@ -96,7 +96,7 @@
 
 protected:
   rdr::FileInStream *in;
-  rfb::Decoder *decoders[rfb::encodingMax+1];
+  rfb::Decoder *decoders[rfb::encodingMax + 1];
   rfb::ManagedPixelBuffer pb;
   rfb::SimpleUpdateTracker updates;
   class SConn *sc;
@@ -163,7 +163,7 @@
   setStreams(in, NULL);
 
   memset(decoders, 0, sizeof(decoders));
-  for (i = 0;i < rfb::encodingMax;i++) {
+  for (i = 0; i < rfb::encodingMax; i++) {
     if (!rfb::Decoder::supported(i))
       continue;
 
@@ -184,7 +184,7 @@
 
   sc = new SConn();
   sc->cp.setPF(pb.getPF());
-  sc->setEncodings(sizeof(encodings)/sizeof(*encodings), encodings);
+  sc->setEncodings(sizeof(encodings) / sizeof(*encodings), encodings);
 }
 
 CConn::~CConn()
@@ -195,7 +195,7 @@
 
   delete in;
 
-  for (i = 0;i < rfb::encodingMax;i++)
+  for (i = 0; i < rfb::encodingMax; i++)
     delete decoders[i];
 }
 
@@ -272,9 +272,9 @@
   unsigned long long bytes, equivalent;
 
   bytes = equivalent = 0;
-  for (iter = stats.begin();iter != stats.end();++iter) {
+  for (iter = stats.begin(); iter != stats.end(); ++iter) {
     StatsVector::value_type::iterator iter2;
-    for (iter2 = iter->begin();iter2 != iter->end();++iter2) {
+    for (iter2 = iter->begin(); iter2 != iter->end(); ++iter2) {
       bytes += iter2->bytes;
       equivalent += iter2->equivalent;
     }
@@ -348,12 +348,12 @@
   int i;
   do {
     sorted = true;
-    for (i = 1;i < count;i++) {
+    for (i = 1; i < count; i++) {
       if (array[i-1] > array[i]) {
         double d;
         d = array[i];
-        array[i] = array[i-1];
-        array[i-1] = d;
+        array[i] = array[i - 1];
+        array[i - 1] = d;
         sorted = false;
       }
     }
@@ -385,8 +385,8 @@
       continue;
 
     if (argv[i][0] == '-') {
-      if (i+1 < argc) {
-        if (rfb::Configuration::setParam(&argv[i][1], argv[i+1])) {
+      if (i + 1 < argc) {
+        if (rfb::Configuration::setParam(&argv[i][1], argv[i + 1])) {
           i++;
           continue;
         }
@@ -419,18 +419,18 @@
   runTest(fn, &ratio);
 
   // Multiple runs to get a good average
-  for (i = 0;i < runCount;i++)
+  for (i = 0; i < runCount; i++)
     times[i] = runTest(fn, &ratio);
 
   // Calculate median and median deviation
   sort(times, runCount);
-  median = times[runCount/2];
+  median = times[runCount / 2];
 
-  for (i = 0;i < runCount;i++)
+  for (i = 0; i < runCount; i++)
     dev[i] = fabs((times[i] - median) / median) * 100;
 
   sort(dev, runCount);
-  meddev = dev[runCount/2];
+  meddev = dev[runCount / 2];
 
   printf("CPU time: %g s (+/- %g %)\n", median, meddev);
   printf("Ratio: %g\n", ratio);
