 | 2013-04-24 Who is leeching my Facebook |
 | 2013-04-15 Time for a compact Coolpix |
 | 2013-04-15 Selling my Peavey amp |
 | 2013-03-28 encfs Helper Revisited |
 | 2013-03-15 c conf 1.17 |
 | 2013-02-25 Flitsers op de Nederlandse wegen |
 | 2013-01-14 OTG Revisited |
 | 2013-01-11 Kalk revisited |
 | 2012-12-12 God is coming |
 | 2012-11-29 Strangely disturbing |
 | 2012-11-27 How to sneeze on a motorbike |
 | 2012-11-23 Een aanslag uit de toekomst |
 | 2012-11-22 More voluntary layoffs |
 | 2012-10-17 Browser fingerprint |
 | 2012-10-15 Site layout revamped |
 | 2012-10-14 Crossroads performing well |
 | 2012-10-08 The saddle seat |
 | 2012-09-30 Sudo Exploit |
 | 2012-09-26 Technomona is live |
 | 2012-09-19 A Perl to HTML Prettyprinter |
 | 2012-09-17 Playing with Moose |
 | 2012-08-22 How do you export photos from Adobe Photoshop Elements |
 | 2012-08-21 Security hole at the Empire State Building |
 | 2012-07-15 Matrix Sunglasses |
 | 2012-07-12 Two Morgans |
 | 2012-07-12 Review of the BMW R1200RT Motorbike |
 | 2012-06-13 Passwords: maak het hackers moeilijk |
 | 2012-06-13 Mijndomein foutje |
 | 2012-06-07 YOLNT |
 | 2012-06-06 Human Origins |
 | 2012-05-23 Me on Facebook |
 | 2012-05-16 Voluntary Layoffs |
 | 2012-05-07 RBS Bike Tour |
 | 2012-04-27 Room with a view |
 | 2012-04-23 Browser cookies and Javascript revisited |
 | 2012-02-17 Schrodingers Cat |
 | 2012-02-14 KPN heeft problemen |
 | 2012-01-12 Memebase forever |
 | 2012-01-11 Strange squares |
 | 2011-12-22 TVV Ondernemingsportaalnl.com zuigt ezel |
 | 2011-12-08 Dilbert vs Skype |
 | 2011-11-29 The uncanny resilience of bulshytt |
 | 2011-11-23 Another silly Trojan attempt |
 | 2011-10-29 ACTA is coming our way |
 | 2011-10-28 Burgernet in the Netherlands |
 | 2011-10-27 Facepalm art |
 | 2011-10-26 Do not drag this image |
 | 2011-10-22 Off The Grid Challenge |
 | 2011-10-12 PI like a boss |
 | 2011-10-07 Once upon a time |
 | 2011-07-13 Dutch eticket system for trains |
 | 2011-07-12 Is Hell exothermic or endothermic |
 | 2011-04-27 Optical Illusions |
 | 2011-04-19 Odd lyrics |
 | 2011-04-16 Band Revival at MON |
 | 2011-03-13 Protests in the Middle East and you |
 | 2011-03-10 Mac OSX Hotkey for locking your system |
 | 2011-02-12 dnspb 0.06 is out |
 | 2011-02-08 Would I buy this fridge |
 | 2011-02-06 InstaYouth |
 | 2011-02-05 The Thinker is back |
 | 2011-01-17 Math challenge |
 | 2011-01-11 Zero tolerance and zero intelligence |
 | 2011-01-05 My interest income in 1991 |
 | 2011-01-01 Your horoscope by Eddie |
 | 2010-12-22 New York City Tours might be half price for you |
 | 2010-12-20 Weather Forecast |
 | 2010-12-14 World Economy Collapse explained in 3 minutes |
 | 2010-12-13 The Salvation Army and its choice of toys |
 | 2010-12-08 Elizabeth thinks highly of me |
 | 2010-12-06 Should I trust my government with my data |
 | 2010-12-05 Announcing dnspb |
 | 2010-12-03 Realistic piechart |
 | 2010-11-26 Crossroads 2.71 is out |
 | 2010-11-24 8 bit Starwars |
 | 2010-11-17 Six to eight black men |
 | 2010-11-16 Canada wants backdoors and data and everything |
 | 2010-11-11 Autumn storm over the Netherlands |
 | 2010-10-08 USA wants backdoors to everything |
 | 2010-10-05 Sudoku solver in Perl |
 | 2010-10-02 Finally wrote up a Syscheck page |
 | 2010-09-28 Neon sign fail |
 | 2010-09-27 The Renault Eco Team |
 | 2010-09-23 Crossroads 2.68 is out |
 | 2010-09-20 How to suppress Flash cookies |
 | 2010-09-15 Meanwhile on Facebook |
 | 2010-09-09 The Yes Men Fix The World |
 | 2010-09-07 ed is not dead |
 | 2010-08-26 Installing Perl modules in a non root environment |
 | 2010-08-22 Magic self leviation |
 | 2010-08-20 Google Chrome does not support offline Gmail |
 | 2010-08-19 The number 48 |
 | 2010-08-12 Welsh trout mini HOWTO |
 | 2010-08-04 Fooling a NetCache proxy into fetching forbidden files |
 | 2010-07-30 The world will end on May 21, 2011 |
 | 2010-07-28 Hiding or showing a textbox with image animation using JQuery |
 | 2010-07-27 Manipulating browser cookies using Javascript |
 | 2010-07-25 Survival of the fittest book |
 | 2010-07-23 Pastafarians in Spain |
 | 2010-07-22 You have two sheep |
 | 2010-07-09 Highway bank fire |
 | 2010-07-08 Setting up a remote git repository |
 | 2010-07-06 Bye bye trusted old Macbook |
 | 2010-06-28 John Cleese on Football |
 | 2010-06-23 ABN Amro and the Pathetic Customer Service Dept. |
 | 2010-06-22 Wally does not like criticism |
 | 2010-06-14 Soccermatch Netherlands vs Denmark |
 | 2010-06-13 Lazy Cat |
 | 2010-06-08 Reading public Buzz using the Google API |
 | 2010-06-07 A Personal Letter from Steve Martin |
 | 2010-06-05 Sushi Saturday |
 | 2010-06-04 Suppressing the Enter key with Javascript |
 | 2010-05-31 Temporal spacial anomaly on the Dutch highway |
 | 2010-05-23 Greenhost will not log your traffic |
 | 2010-05-10 Jarlsberg Webapp Exploits |
 | 2010-05-04 A Thought Experiment |
 | 2010-05-03 SafeEdit information updated |
 | 2010-05-01 Microproxy now supports ftp |
 | 2010-04-30 What could get Data angry |
 | 2010-04-29 Lego Mindstorm solving the Rubik Cube |
 | 2010-04-28 Crossroads 2.65 is out |
 | 2010-04-17 Goggomobil in its natural habitat |
 | 2010-04-14 Bacon Time |
 | 2010-04-11 104 More friends to connect with |
 | 2010-04-10 Bacteria infested radio reporter |
 | 2010-04-07 The Kubat STAR |
 | 2010-03-30 Homework Essay |
 | 2010-03-29 C++ mutexes again |
 | 2010-03-20 Weird Eyechart |
 | 2010-03-15 Microproxy 1.01 |
 | 2010-03-05 Microproxy |
 | 2010-03-03 Sven Kramer and the wrong lane |
 | 2010-02-26 Endearing Babe Magnet |
 | 2010-02-17 Speed of light measured using chocolate and a microwave |
 | 2010-02-17 Never again expires after 65 years |
 | 2010-02-16 encfs on the Mac |
 | 2010-02-15 Hyves.nl and sexual predators |
 | 2010-02-10 Funny textbook |
 | 2010-02-09 DNS failing after sleep wake cycle |
 | 2010-02-06 Blast from the past |
 | 2010-01-28 Simple and straight Perl HTTP::Proxy |
 | 2010-01-15 Avatar the Movie |
 | 2010-01-08 Slightly NSFW Linux Ad |
 | 2010-01-07 WTF |
 | 2010-01-05 Stop Software Patents in the EU |
 | 2009-12-05 HammerServer 1.02 |
 | 2009-11-28 Perls Automagical Autoloading |
 | 2009-10-07 Office Poster |
 | 2009-10-06 The nr 1 Nerdjoke |
 | 2009-10-04 WoW Startscript for my Mac |
 | 2009-09-27 HammerServer section is online |
 | 2009-09-26 The BING HQ |
 | 2009-09-26 Digging a WOW Tunnel |
 | 2009-06-29 Wee Todd |
 | 2009-06-23 The On Off Switch Revisited |
 | 2009-06-22 Meatspace |
 | 2009-05-30 My old houses |
 | 2009-05-11 LOLcats are funny |
 | 2009-05-11 Civic Duty WIN |
 | 2009-05-10 Vote for the baby, Sky Radio promo FAIL |
 | 2009-05-05 My secure data center |
 | 2009-02-15 My Valentine is sending me a dot exe |
 | 2009-02-05 MacPorts trash: .mp_123456 savefiles cleaning |
 | 2009-02-01 Truecrypt 6 on Linux and the ext3 filesystem |
 | 2009-01-28 www versus nl.youtube.com |
 | 2009-01-27 Songsmith and The Police |
 | 2009-01-25 My own Ministery of Silly Walks |
 | 2009-01-09 CoolIris Mini HOWTO |
 | 2008-11-04 UDP and DNS balancing |
 | 2008-11-02 Life in graphs |
 | 2008-11-01 Skeined yet? |
 | 2008-10-30 New Crossroads on the horizon |
 | 2008-10-28 Thread safe or not |
 | 2008-10-15 WOW patch 3 on a case sensitive MacOSX filesystem |
 |
2008-10-15 Surprising C++ optimizations |
|
Over the last few days I've been optimizing my pet load balancer
Crossroads. I'm happy to say that the
optimizations have been hugely succesful - a 25% increase in raw TCP
throughput, and an 80% increase in HTTP mode. The optimizations
involved many facets, some of which I had expected, others very surprising.
Here's a surprising one.
Normally when I write programs - especially daemons, like
Crossroads - I make sure that I implement a layered logging facility. For
example: errors and warnings are always logged, informational messages
only when flag -v is used, and debug messages only when flag -d is
used. Standard approach, right?
A likely C way to implement this, might be to have
functions errormsg(), warningmsg() and so on.
Inside the "verbose information" function, a flag is inspected to see
whether -v was given on the command line. To illustrate:
void verbosemsg(char const *fmt, ...) {
if (! flag_verbose)
return;
.
. /* Here the message is actually output, e.g. using
. * va_start(), vprintf(), va_end()
. */
.
}
The calling code simply calls verbosemsg() without regard
to the flag -v. The actual decision whether to output messages is
inside the function. The idea is that the calling code doesn't need to
be cluttered with if-statements to check
whether flag_verbose is on or not. For example, here's
some calling code:
/* Example of calling code */
verbosemsg ("Running at PID %d\n", getpid());
So far so good, except that Crossroads isn't a C program, but a
C++ program. So, keeping in mind "good C++ style",
a printf-like approach is a big no-no, right? Ok, let's then
try a true OO-approach. I've illustrated some concepts in the
following code. It's a bit lengthier (because it's a working piece of
code), and defines a helper class msgstring, so that it's
possible to append an integer to a string. The msgstring
is output in class verbosemsg.
#include <iostream>
#include <sstream>
#include <string>
using namespace std;
// msgstring is derived from string, to enable "+ int"
// Other appending operators can be added ad lib.
class msgstring: public string {
public:
// Start with a simple char*
msgstring(char const *s): string(s) {
}
// Or with a string
msgstring(string const &s): string(s) {
}
// Concatenation with an int
msgstring const &operator+ (int i) {
ostringstream o;
o << i;
*this += o.str();
return *this;
}
};
// for testing:
bool flag_verbose = true;
class verbosemsg {
public:
// Constructor that outputs info when flag_verbose is true
verbosemsg (msgstring const &s) {
if (flag_verbose)
cout << s;
}
};
// main() to test it all
int main() {
verbosemsg (msgstring("Hello World!\n"));
int i = 42;
verbosemsg (msgstring("The answer is.. ") + i + "\n");
return 0;
}
So far so good. The caller can still say verbosemsg(...)
without having to wrap this in an awkward if-statement. The decision
whether to output a message is made later. Incidentally, in the above
code verbosemsg is a class. It could just as well be a
function, that doesn't matter.
But here's the catch. When no verbose messages are
generated, then the overhead in the C version is: one call, one if.
The overhead in the C++ version is way bigger: the entire message must
be constructed, overloaded + operators are called to concatenate
information, and that object is passed via reference
to verbosemsg. Only then is the if condition evaluated.
The result? The C++ code is much slower. Really.
So now what? It's quite a pickle. I see the following options:
As I see it, this is just another example of the following: "C was
created to be fast. C++ is an addon to make it neat and pretty." Speed
or beauty? It just depends on your situation at hand...
 | Upon reading the above, Eddie wrote me to point out that the
construct if(condition) generateoutput(string + string
...) is very common in Java, to make sure that logging
doesn't hog up too many resources. He further remarked that
it's a shame that Java doesn't have preprocessing. Else,
one could wrap the whole thing in a macro. |
Thinking about it: yes, that's pretty usable. It moves the
if-condition into the caller's code without the necessity to type the
if-statement all the time. So here's a quick and dirty illustration of
the concept. May the source be with you.
#include <iostream>
#include <sstream>
#include <string>
using namespace std;
/* Class Mstr: derived from string to allow for overloading '+'
* which handles concatenation of the string with other types
*/
class Mstr: public string {
public:
Mstr(string s): string(s) {}
Mstr(char const *s): string(s) {}
Mstr const &operator+ (int i) {
ostringstream o;
o << i;
*this += o.str();
return *this;
}
};
/* Class Msg: encapsulates the on/off state of the verbose flag,
* and defines a method msg() that outputs an Mstr. Caller must
* wrap the msg() call in a if-condition that tests Msg::on().
*/
class Msg {
public:
static void msg (Mstr const &m) {
cout << m;
}
static void on(bool o) {
enabled = o;
}
static bool on() {
return enabled;
}
private:
static bool enabled;
};
bool Msg::enabled = false;
/* For easy usage:
* Macro verbosemsg() handles the if-condition of Msg::on()
* and optionally calls Msg::msg() to generate output
*/
#define verbosemsg(x) if (Msg::on()) Msg::msg(x)
/* And of course, main() to test it with a couple of
* verbose statements. */
int main() {
Msg::on(true);
verbosemsg("Hello World!\n");
for (int i = 1; i < 5; i++)
verbosemsg(Mstr("Loop: ") + i + "\n");
return 0;
}
|
|
|
 | 2008-10-14 Weird system message |
 | 2008-10-08 Data mining against terrorism does not work |
 | 2008-09-16 Crossroads at the top of Freshmeat.net |
 | 2008-09-09 Stupid spammers at Computable |
 | 2008-09-06 Spam prevention with Postfix and Postgrey |
 | 2008-09-03 The Gnomish Flying Machine |
 | 2008-08-27 Bank customer data on eBay |
 | 2008-08-26 Mutexes in C++ Threads |
 | 2008-08-22 4M dataloss in the UK last year |
 | 2008-08-21 Dropping spam with Postfix and Spamassassin |
 | 2008-08-18 Bayes and the War on Photography |
 | 2008-08-13 Good marital advice |
 | 2008-08-12 Squid proxy for personal usage |
 | 2008-08-11 Posix threads in C++ |
 | 2008-08-09 Crossroads mailing list |
 | 2008-08-08 Crossroads 2.00 is out |
 | 2008-08-01 Fail Pics |
 | 2008-07-14 The Fish Dance |
 | 2008-07-01 Big Bother and Massive Data Storage |
 | 2008-06-30 MMV One of omitted Unix tools |
 | 2008-06-08 Even anonymous breadcrumbs can give you away |
 | 2008-05-29 Crossroads in Argentina |
 | 2008-05-20 The Party at the Company Outing |
 | 2008-05-19 Crossroads 1.80 is out |
 | 2008-05-18 Where does technical innovation really come from |
 | 2008-05-16 Corporate bs generator |
 | 2008-05-15 Even the Vatican has to adapt |
 | 2008-05-12 Big Brother is watching your dog |
 | 2008-05-09 666 all over the place |
 | 2008-04-17 Security and privacy are incompatible |
 | 2008-04-16 The Hallmark E Card |
 | 2008-04-15 Crosroads Solaris port is out |
 | 2008-04-04 Identity theft can cost you dearly |
 | 2008-04-03 Crossroads can already do that |
 | 2008-03-31 A dagerous safari |
 | 2008-03-28 Why some Java J2EE projects are inefficient |
 | 2008-03-26 The Hummingbird |
 | 2008-03-25 The Easter delusion |
 | 2008-03-18 McAfee detects mass hack of 200.000 webpages |
 | 2008-03-17 More predictive statistics |
 | 2008-03-10 Backwards conclusions even on Slashdot |
 | 2008-02-18 A fractal photograph |
 | 2008-02-15 Kaprekar revisited |
 | 2008-02-14 Kaprekar numbers |
 | 2008-02-12 A tale of the criminal ineptitude |
 | 2008-02-10 Irritating Selfregistered users in PHPBB |
 | 2008-02-08 B2B Spam in the Netherlands |
 | 2008-02-06 Surprising iSight Capture |
 | 2008-02-05 Breadcrumbs at WickedLasers.com |
 | 2008-01-29 iSight Capture Utility |
 | 2008-01-28 The Male Brain |
 | 2008-01-26 Searching for the next Uri Geller |
 | 2008-01-24 Opt in for b2b spam |
 | 2008-01-14 Bokito Revisited |
 | 2008-01-13 Top Crossroads User |
 | 2008-01-12 World of Warcraft Dancing |
 | 2008-01-12 Justice dispensed better late than never |
 | 2008-01-11 Jeremy Clarkson and Identity Theft |
 | 2008-01-10 Terrorism in the Netherlands |
 | 2007-12-07 The mind and bodysnatchers are among us |
 | 2007-12-05 Bruce Schneier and Hildo |
 | 2007-12-04 Bye bye, good Christian soul |
 | 2007-12-03 Confusing mail message |
 | 2007-11-30 Medion MD 85276 reviewed |
 | 2007-11-29 Recent cases of data exposure |
 | 2007-11-20 Bayes bites |
 | 2007-11-19 Japan starts fingerprinting foreigners |
 | 2007-11-14 Privacy, Yahoo and the Strange World |
 | 2007-11-14 Privacy, Fall through algorithms, and Securing data |
 | 2007-11-07 European airlines to retain data |
 | 2007-11-03 BloggEd |
 | 2007-10-30 Wilders and Marktplaats.nl |
 | 2007-10-28 The goldplated Mac |
 | 2007-10-26 More morons |
 | 2007-10-26 Dilbert nails it again |
 | 2007-10-23 Rough yet funny |
 | 2007-10-05 Another silly Trojan mail |
 | 2007-10-01 So ugly it is beautiful |
 | 2007-09-28 Here is a nickel kid |
 | 2007-09-23 Spy Shredder |
 | 2007-08-29 Web svn view 1.08 |
 | 2007-08-24 Caught in THE Process |
 | 2007-08-21 Stupid Trojan attack |
 | 2007-08-21 Back in 1994 |
 | 2007-08-20 A girly iPod |
 | 2007-08-17 Crossroads for RDP connections |
 | 2007-08-15 Firewall art |
 | 2007-08-14 jpeginfo |
 | 2007-08-13 Good People |
 | 2007-08-07 The Real Crossroads |
 | 2007-07-30 BBC Documentaries in the Netherlands |
 | 2007-07-12 No problems with Crossroads so far |
 | 2007-07-11 Politically correct ad nauseam |
 | 2007-07-02 Waka Waka Poem |
 | 2007-07-02 Voyage of the rubber ducks |
 | 2007-06-28 The On Off Switch |
 | 2007-06-27 No free lunch |
 | 2007-06-25 Crossroads web interface |
 | 2007-06-25 Blinkenlights |
 | 2007-06-21 There is no silver bullet |
 | 2007-06-18 Motto of the week |
 | 2007-06-18 Do not feed the troll |
 | 2007-06-17 Which programming language are you |
 | 2007-06-13 Crossroads support request |
 | 2007-06-12 Bokito glasses |
 | 2007-06-07 Apache mod_proxy balancer description |
 | 2007-06-05 A ticketnumber is not support |
 | 2007-06-05 403 Hammertime |
 | 2007-06-04 Playground Fun |
 | 2007-05-24 Ascii man |
 | 2007-05-07 Cannot find the damn server |
 | 2007-05-02 The BFG200 |
 | 2007-04-27 Crossroads Top User |
 | 2007-03-30 Crossroads Usage |
 | 2007-03-25 The guy with the dark motorhelmet |
 | 2007-03-22 The Process and The Result |
 | 2007-03-21 Quotes attributed to Jos |
 | 2007-03-20 A really nice comment about Crossroads |
 | 2007-03-18 Kubat in the air |