[Arduino Micro] Changing the baud rate has no effect on transmission speed?

Hello all,

I'm trying to send data at a pretty high transmission rate( ~1Mbaud) from an Arduino Micro to the PC. I read that people achieved high data rates using the Uno, but information regarding the Micro seems scarce. Given the 16 Mhz clock and the "full speed USB 2.0" connection (http://arduino.cc/en/pmwiki.php?n=Main/ArduinoBoardMicro) I guess it should be possible?

I'd like to transmit 14 Bytes per message (=one measurement) and up to 5000 messages per second (=5kHz sampling rate). Transmitting one byte actually takes 10 bits, so we end up with 14 * 10 * 5000 = 700kBit/s.

As I couldn't get anywhere near those bit rates, I reduced my sketch to the following

    void setup()
  {
    Serial.begin(115200);  // initialize serial communication 
	}  
  void loop()
  {
   PORTC = PORTC | B10000000;   // Set Pin13 (LED) HIGH
	Serial.println("*12345~98765#");   // takes ~78µs without monitoring serial data on PC and ~256 µs with an serial console open 
   PORTC = PORTC & B01111111;   // Set Pin13 (LED) LOW
  }

I'm using an oscilloscope to measure the duration of the high state (=time needed to execute the data transmission). I found two things I can't explain to myself:

  1. The baud rate I'm using in the statement
Serial.begin(115200);

doesn't seem to have an effect on the time needed to transmit one message ("*12345~98765#"'\r''\n'). I tried 9600 buad, 115200 baud and 1000000 baud and get always the same values.
2) The time needed to execute

Serial.println("*12345~98765#");

once depends on the programs I'm running on my PC. When I'm using any serial console (Arduino IDE SerialMonitor, Putty, Termite) it gets substantially longer than without monitoring the transmission. It takes ~78µs without monitoring serial data on PC and ~256 µs with an serial console open.

CodingBadly mentioned in this thread that baud rate is irrelevant, but unfortunately I don't understand why: Comparing crunching power or serial troughput of Uno and Micro boards - Microcontrollers - Arduino Forum

It's also reproducible using this code, though obviously you won't be able to measure the ~78µs as this version relies on opening a console:

  unsigned long t0, t1;
  
  void setup()
  {
    
    Serial.begin(9600);  // initialize serial communication 
  }  
  void loop()
  {
   //PORTC = PORTC | B10000000;   // Set Pin13 (LED) HIGH
   t0 = micros();
	Serial.println("*12345~98765#");   // takes ~256 µs with an serial console open 
   t1 = micros();
   Serial.println(t1-t0);
   //PORTC = PORTC & B01111111;   // Set Pin13 (LED) LOW
  }

Thank you very much for the explanation pepe.

Let's assume that one needs 10 bits for transmitting 1 byte as with serial transmission. I'm sending 13 data bytes + two bytes from println(). That is 15 * 10 bits = 150 bits. It takes ~ 260µs, so I get 150 bits / 260 µs = 578 kbit/s. That's a long way from 12 Mbps.

Is there any chance to speed things up? If the host controls the the transmission speed, where would one start looking?

The Micro presents itself as a Virtual serial port, but the Baudrate doesn't affect transmission speed...I'm kinda lost here as I don't understand what's happening "within" the emulated COM-Port and how to influence that :frowning:

pepe:
For instance, you can speed up using a program on the PC much faster than the serial monitor (I've already managed to send data over Serial/USB at 1 Mbaud).

That sounds promising, could you please give a little more detail how you achieved that? I already tried opening the serial port at higher baud rates (e.g. 1Mbip) using Putty and Termite, but the transmission still takes ~260µs.

pepe:
To achieve a 1Mbps transmission, I haven't used a terminal display on the PC, but a program just storing the data into a file, without displaying.

I tried this as well, using LabVIEW VISA to read the data from the serial port as fast as possible and write it to the disk. But I still got the same transmission rate :frowning: Could anyone give me a hint where I can look up what is happening "under the hood" when working with Virtual Com Ports?

pepe:
And on the Arduino, I haven't used the println() function, but directly sent a buffer already containing the bytes.

Could you please give an code example for this? I experimented with for loops sending data by using Serial.write() instead of Serial.println() but couldn't achieve faster transmission. Thank you very much for your help!

Thanks a lot for the example code, this is neat! Unfortunately, it doesn't compile on Arduino 1.0.5. Which version are you using? I get the error

serial_speed_test_2:30: error: invalid conversion from 'char*' to 'const uint8_t*'
serial_speed_test_2:30: error: initializing argument 1 of 'virtual size_t Print::write(const uint8_t*, size_t)'

refering to the line

Serial.write(buff, len);

When changing the buffer definition to

uint8_t buff[1024];

the code compiles, but the transmission speed is still lower than expected (~500kBit/s). I tried with and without an USB Hub, same results. I also seem to get some false readings (additional '0's on the beginning of some lines).

Example output:

001012012301234012345670123456780123456789ABCDEF0123456789ABCDEF-0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
00123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
00123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
00123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
00123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
00123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX

--------------- TEST -----------------
Len	Time	Time	Byte/s	Byte/s
	micros	diff	aver.	inst.
0	8	
1	24	16	41666	62500
2	40	32	50000	62500
3	56	48	53571	62500
4	72	64	55555	62500
5	88	80	56818	62500
8	136	128	58823	62500
9	148	140	60810	64285
16	272	264	58823	60606
17	288	280	59027	60714
32	532	524	60150	61068
33	544	536	60661	61567
64	1056	1048	60606	61068
65	1068	1060	60861	61320
128	2100	2092	60952	61185
129	2116	2108	60964	61195
256	4196	4188	61010	61127
257	4204	4196	61132	61248
512	8376	8368	61127	61185
513	8404	8396	61042	61100
1024	16740	16732	61170	61200
overall test:
3078	50568		60868
--------------------------------------

And a example output when using a

delay(1);

in the test loop:

--------------------------------------
001012012301234012345670123456780123456789ABCDEF0123456789ABCDEF-0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
00123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
00123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
00123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
00123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
00123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX

--------------- TEST -----------------
Len	Time	Time	Byte/s	Byte/s
	micros	diff	aver.	inst.
0	4	
1	20	16	50000	62500
2	36	32	55555	62500
3	56	52	53571	57692
4	72	68	55555	58823
5	84	80	59523	62500
8	136	132	58823	60606
9	152	148	59210	60810
16	264	260	60606	61538
17	292	288	58219	59027
32	520	516	61538	62015
33	552	548	59782	60218
64	1052	1048	60836	61068
65	1068	1064	60861	61090
128	2096	2092	61068	61185
129	2112	2108	61079	61195
256	4188	4184	61127	61185
257	4212	4208	61016	61074
512	8372	8368	61156	61185
513	8388	8384	61158	61187
1024	16752	16748	61127	61141
overall test:
3078	71644		42962
--------------------------------------

The Average Bitrate drops to ~350kBits/s

pepe:
You should try this test sketch, which sends data packets of different sizes :
....SNIP....

The results are in bytes per second, so you have to multiply by 8 and 10 to get bits/s and bauds.

On Arduino Leonardo (with direct USB interface, as on Arduino Micro) :
• the average transmission speed over the whole test (including delays) is more or less 1 Mbits/s.
• the transmission speed can be higher than 10 Mbits/s, especially when sending more or less 64 bytes (i.e. the USB buffer size) at one time.
• adding a 1 ms delay in the test loop can lead to better and more stable results.

I must try this.

My tests with high baud rates on an Uno suggest that the best round-trip time is about 4 msecs regardless of the size of the data transfer (11 bytes to 88 bytes) and I attribute this to the USB system overhead. By "round-trip" I mean the sequence in which the Arduino sends "" and the PC program responds with some data.

It had occurred to me that the baud rate is pretty meaningless on a Leonardo - but I hadn't thought to check it.

...R

Update ...

I think there must be a mistake somewhere because on an Uno at 9600 baud it shows a max throughput of 170,000 bytes per second.

In general I think this sort of demo or test needs to be tailored to a specific requirement.

However I must try my own turnaround-speed test on my Leonardo.

...R

Is you Arduino really a "Micro" ? ...

Yep, it really is. I just downloaded Arduino 1.5.7 and amazingly the same code now gives ~1Mbit/s!

--------------------------------------
001012012301234012345670123456780123456789ABCDEF0123456789ABCDEF-0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
00123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
...
...
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX
0123456789ABCDEF-XXXXXXXXXXXXX

--------------- TEST -----------------
Len	Time	Time	Byte/s	Byte/s
	micros	diff	aver.	inst.
0	12	
1	20	8	50000	125000
2	24	12	83333	166666
3	20	8	150000	375000
4	24	12	166666	333333
5	20	8	250000	625000
8	24	12	333333	666666
9	24	12	375000	750000
16	28	16	571428	1000000
17	44	32	386363	531250
32	36	24	888888	1333333
33	44	32	750000	1031250
64	60	48	1066666	1333333
65	60	48	1083333	1354166
128	1112	1100	115107	116363
129	1112	1100	116007	117272
256	2204	2192	116152	116788
257	2200	2188	116818	117458
512	4392	4380	116575	116894
513	4388	4376	116909	117230
1024	8740	8728	117162	117323
overall test:
3078	24680		124716
--------------------------------------

Comparing the two outputs, it becomes clear that the transmission speed is going up as the numer of bytes transmitted is getting closer to 64 bytes (=the USB buffer size). That wasn't the case when compiled with Arduino 1.0.5. I even found mentioning of that in the release notes of Arduino 1.5.7. BETA:

* avr: Improved USB-CDC write speed (Justin Rajewski)

Again, pepe, thank you very much for providing the code and helping me understand what's happening here :slight_smile:

65	60	48	1083333	1354166

As the column is headed "Byte/S" the number 1,083,333 represents 8,666,664 bits / sec (assuming 8 bits/byte).

Is this reasonable?

I got this line on an Uno at 115200 baud

17	112	108	151785	157407

and 151,785 bytes per second = 1,517,850 bits per second which is NOT reasonable.

...R

Hm, I'm not sure if I've got it right, but here's how I see it:

151785 Bytes / s = 1214280 Bits / s = 121428 baud(assuming 10 bits per Symbol)

That's close to the 115200 baud you're trying to use, but I can't explain why you see a "higher than expected" transmission rate.

pepe:
This test is not intended to be run on an Arduino with a separate USB link such as Uno, Due, Mega or Nano. In this case, the results are inconsistent.

On an Arduino whose application MCU integrates the USB interface (Micro, Leonardo or Yún), the maximum theorical speed is 12 Mbit/s. So reading an average speed of 8.6 Mbit/s is reasonable.

I can see the logic of your last sentence (above) but I am not at all convinced that your tests on the Leonardo are consistent in the way you seem to think. Why, for example, is the max data rate at 64/65 bytes? Why don't you get the same rate at any multiple of 64?

I think to be more useful your program should run several hundred iterations at each data size and average the time.

When I run my own test (requesting a byte and then receiving data) the turnaround time on a Leonardo is about 3msecs compared to 4msecs on an Uno.

...R

Update ...

I have modified (simplified) the test code so it just tries one data length 500 times.

On my Leonardo it gives a speed of about 60,000 bytes/sec and on my Uno at 115200 baud it gives 11,700 bytes /sec.

The data length has very little impact on the speed.

unsigned long nBytes = 16;
const char testString[] = "0123456789ABCDEF-XXXXXXXXXXXXX\r\n";

char buff[1024];

void setup() {
  for (int i=0;i<1024;i++)
    buff[i] = testString[i&31];
  
  Serial.begin(115200);
  while(!Serial);
  
  runTest();
}

void runTest() {
  unsigned long t0, t1, elapsed;
  unsigned long numLoops = 500;
  unsigned long totalBytes;
  
  totalBytes = numLoops * nBytes;
  t0 = micros();
  for (int n = 0; n < numLoops; n++) { 
    Serial.write(buff, nBytes);
  } 
  t1 = micros();
  elapsed = t1 - t0;
  unsigned long bps = totalBytes * 10000 / elapsed * 100;

  Serial.println();
  Serial.print("Loops ");
  Serial.print(numLoops);
  Serial.print(" Total ");
  Serial.print(totalBytes);
  Serial.print(" Elapsed Micros ");
  Serial.print(elapsed);
  Serial.print(" Bytes/Sec ");
  Serial.println(bps);
}

void loop() {

}

...R

pepe:
you would have known it was possible to run the USB link twice as fast as that.

Sorry, I'm not clear what you mean by the word "that" in the phrase "as fast as that".

Have you tried my version of the code and have you managed to get a throughput greater than 60,000 bytes per sec? Change the length of data transmission to optimize your result.

I believe my version gives consistent results on an Uno and a Leonardo.

I am interested in this because I am building a project in which I want to maximize throughput.

...R

pepe:
I've run your test on a Leonardo without changing anything, and I get 5 to 7 times as fast as that speed :

Thanks for taking the trouble. Your results are very interesting.

I have been using 1.5.6 and I think your results are with 1.5.7 - so I must try that (tomorrow).

Edit to add ....

I have now tried this with 1.5.7Beta and my 60,000 bytes/sec has gone up to 300,000 - huge improvement!

As expected there was no significant change on the Uno where the speed is dictated by the baudrate.

From a more practical point of view the turnaround time (on the Leonardo) in my other test has fallen to about 2 msecs - half what it is on an Uno and 33% better on the Leonardo than 1.5.6r2.

...R