<?xml version="1.0" encoding="UTF-8"?>
<!-- generator="bbPress/1.0.2" -->
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>LeafLabs Garden &#187; Topic: Code Writing Level</title>
		<link>http://forums.leaflabs.com/topic.php?id=269</link>
		<description>A place to share, learn, and grow...</description>
		<language>en-US</language>
		<pubDate>Fri, 22 Jan 2016 00:23:06 +0000</pubDate>
		<generator>http://bbpress.org/?v=1.0.2</generator>
		<textInput>
			<title><![CDATA[Search]]></title>
			<description><![CDATA[Search all topics from these forums.]]></description>
			<name>q</name>
			<link>http://forums.leaflabs.com/search.php</link>
		</textInput>
		<atom:link href="http://forums.leaflabs.com/rss.php?topic=269" rel="self" type="application/rss+xml" />

		<item>
			<title>Silntknight on "Code Writing Level"</title>
			<link>http://forums.leaflabs.com/topic.php?id=269&amp;page=2#post-2124</link>
			<pubDate>Sat, 30 Oct 2010 13:28:46 +0000</pubDate>
			<dc:creator>Silntknight</dc:creator>
			<guid isPermaLink="false">2124@http://forums.leaflabs.com/</guid>
			<description>&#60;p&#62;I'm going to try and keep the work I have to do simple, so anything involving Unix Toolchains will be saved for later projects. I do like the idea of using Git to inspect the code, so I'll probably do that.&#60;/p&#62;
&#60;p&#62;For size, until I exceed the flash size, I won't worry about that. I am more concerned with RAM. I'll look at that later though, after I test my code several times.
&#60;/p&#62;</description>
		</item>
		<item>
			<title>mbolivar on "Code Writing Level"</title>
			<link>http://forums.leaflabs.com/topic.php?id=269&amp;page=2#post-2115</link>
			<pubDate>Fri, 29 Oct 2010 08:51:14 +0000</pubDate>
			<dc:creator>mbolivar</dc:creator>
			<guid isPermaLink="false">2115@http://forums.leaflabs.com/</guid>
			<description>&#60;p&#62;Addendum:&#60;/p&#62;
&#60;blockquote&#62;&#60;p&#62;
As josheeg says, if you really want to turn something into assembler, write C code, then look at the assembler produced by the compiler.&#60;/p&#62;
&#60;/blockquote&#62;
&#60;p&#62;If you need to do this, and have access to a Unix environment (Cygwin will work if you're stuck on Windows), the Unix toolchain makes it easy for you.  Using the provided Makefile, &#34;make&#34; will produce a file build/maple.disas, which contains the generated assembly for your program.  For example, here's the assembly for the libmaple library function timer_resume():&#60;/p&#62;
&#60;p&#62;08005164 &#38;lt;timer_resume&#38;gt;:&#60;br /&#62;
 8005164:       2318            movs    r3, #24&#60;br /&#62;
 8005166:       4343            muls    r3, r0&#60;br /&#62;
 8005168:       4a03            ldr     r2, [pc, #12]   ; (8005178 &#38;lt;timer_resume+0x14&#38;gt;)&#60;br /&#62;
 800516a:       589b            ldr     r3, [r3, r2]&#60;br /&#62;
 800516c:       881a            ldrh    r2, [r3, #0]&#60;br /&#62;
 800516e:       b292            uxth    r2, r2&#60;br /&#62;
 8005170:       f042 0201       orr.w   r2, r2, #1&#60;br /&#62;
 8005174:       801a            strh    r2, [r3, #0]&#60;br /&#62;
 8005176:       4770            bx      lr&#60;br /&#62;
 8005178:       20000c04        andcs   r0, r0, r4, lsl #24&#60;/p&#62;
&#60;p&#62;However, I strongly agree with josheeg's and gbulmer's advice against going this route unless you have really, really tried to get things working in C++, and you've measured exactly which parts of your code are the performance bottlenecks.  gbulmer's words here are sage counsel:&#60;/p&#62;
&#60;blockquote&#62;&#60;p&#62;
[T]here is a LOT of evidence that developers are not very succesful at choosing the right part of the program to optimise ahead of writing it. Further, we are not much better without careful measurement, and lots of developers are quite bad at doing those careful measurements.&#60;/p&#62;
&#60;/blockquote&#62;</description>
		</item>
		<item>
			<title>mbolivar on "Code Writing Level"</title>
			<link>http://forums.leaflabs.com/topic.php?id=269&amp;page=2#post-2114</link>
			<pubDate>Fri, 29 Oct 2010 07:59:50 +0000</pubDate>
			<dc:creator>mbolivar</dc:creator>
			<guid isPermaLink="false">2114@http://forums.leaflabs.com/</guid>
			<description>&#60;p&#62;Silntknight:&#60;/p&#62;
&#60;blockquote&#62;&#60;p&#62;
Do you know which core files/libraries I can look at to get a better idea of port manipulation?&#60;/p&#62;
&#60;/blockquote&#62;
&#60;p&#62;In addition to what gbulmer said, there's a demo of writing directly to ports in order to control a VGA monitor:&#60;br /&#62;
&#60;a href=&#34;http://github.com/leaflabs/projects/blob/master/vga-colors/main.cpp&#34; rel=&#34;nofollow&#34;&#62;http://github.com/leaflabs/projects/blob/master/vga-colors/main.cpp&#60;/a&#62;&#60;/p&#62;
&#60;p&#62;The inner display loop is in isr_draw_line.  VGA_SET_BSRR is the macro that sets all of the pins connected to the monitor at once (and in deterministic time) through port manipulation.&#60;/p&#62;
&#60;p&#62;If memory is an issue, and you have large lookup tables, you can store them (or any other read-only variable) in flash. The same VGA project stores a few ~10K images on the Maple by directing the linker to store them in flash, not RAM.  This is done through a GCC __attribute__; example here:&#60;br /&#62;
&#60;a href=&#34;http://github.com/leaflabs/projects/blob/master/vga-colors/tableau_2.c&#34; rel=&#34;nofollow&#34;&#62;http://github.com/leaflabs/projects/blob/master/vga-colors/tableau_2.c&#60;/a&#62;&#60;/p&#62;
&#60;p&#62;The libmaple linker scripts will put any variables with section attribute set to &#34;.USER_FLASH&#34; into flash, instead of (default) RAM.&#60;/p&#62;
&#60;p&#62;Hope this helps!
&#60;/p&#62;</description>
		</item>
		<item>
			<title>gbulmer on "Code Writing Level"</title>
			<link>http://forums.leaflabs.com/topic.php?id=269&amp;page=2#post-2107</link>
			<pubDate>Fri, 29 Oct 2010 02:30:55 +0000</pubDate>
			<dc:creator>gbulmer</dc:creator>
			<guid isPermaLink="false">2107@http://forums.leaflabs.com/</guid>
			<description>&#60;blockquote&#62;&#60;blockquote&#62;It is a good idea to be clear about speed, size or some other performance quality.&#60;/p&#62;
&#60;/blockquote&#62;
&#60;p&#62;I generally mean speed, though I also meant size here&#60;/p&#62;
&#60;/blockquote&#62;
&#60;p&#62;Ah. I didn't really address size. There are two different sizes to consider, one is code size, the other RAM. I find it hard to give general advice on size optimistions, and would tend to look at the program.&#60;/p&#62;
&#60;p&#62;To get finer control over program size it may be very useful to experiment with building from the command line. This will give access to the pieces of binary code going into the program, and also the compiler. &#60;/p&#62;
&#60;p&#62;Look at the &#60;a href=&#34;http://leaflabs.com/docs/libmaple/unix-toolchain/&#34;&#62;libmaple Unix Toolchain Quickstart&#60;/a&#62;&#60;/p&#62;
&#60;p&#62;Their is a compiler flag (-Os I think, among others) which compiles using optimised code size. You may find the program size is dominated by the libraries. In that case, careful analysis will reveal which are the big pieces, and you may see several ways to cut it down.&#60;/p&#62;
&#60;p&#62;If its data memory (RAM) that is in short supply, there are a few tricks, but it might be so specific to the program that you need to analyse it carefully to find areas to improve.&#60;/p&#62;
&#60;p&#62;Sorry I can't be more concrete, but I find size is often program specific.
&#60;/p&#62;</description>
		</item>
		<item>
			<title>gbulmer on "Code Writing Level"</title>
			<link>http://forums.leaflabs.com/topic.php?id=269&amp;page=2#post-2106</link>
			<pubDate>Fri, 29 Oct 2010 02:07:36 +0000</pubDate>
			<dc:creator>gbulmer</dc:creator>
			<guid isPermaLink="false">2106@http://forums.leaflabs.com/</guid>
			<description>&#60;blockquote&#62;&#60;p&#62;Do you know which core files/libraries I can look at to get a better idea of port manipulation?
&#60;/p&#62;&#60;/blockquote&#62;
&#60;p&#62;if you have git, or can install it on a computer, go to &#60;a href=&#34;http://leaflabs.com/docs/libmaple/&#34;&#62;&#60;a href=&#34;http://leaflabs.com/docs/libmaple/&#34; rel=&#34;nofollow&#34;&#62;http://leaflabs.com/docs/libmaple/&#60;/a&#62; and it gives the git command to download (clone) the source code repository. So run the command and get the libmaple source code. It is full of useful stuff.&#60;/p&#62;
&#60;p&#62;The files are pretty helpfully split into two sets. I use grep to find the ones I am looking for, which is how I found the pieces I pulled out in my post. For example libmaple/wirish has the Arduino library look-alikes, e.g. things like analogRead.&#60;br /&#62;
digitalWrite and digitalRead are in wirish_digital.c, and libmaple/libmaple has the definition of PIN_MAP in boards.h&#60;br /&#62;
(It'll be a bit easier to find stuff if you have a way to search for text in the two directories.)&#60;/a&#62;
&#60;/p&#62;</description>
		</item>
		<item>
			<title>Silntknight on "Code Writing Level"</title>
			<link>http://forums.leaflabs.com/topic.php?id=269&amp;page=2#post-2101</link>
			<pubDate>Thu, 28 Oct 2010 21:11:21 +0000</pubDate>
			<dc:creator>Silntknight</dc:creator>
			<guid isPermaLink="false">2101@http://forums.leaflabs.com/</guid>
			<description>&#60;p&#62;Lots to think about here. I was especially interested in the direct manipulation of pins for the spark plug because it is handled inside an interrupt. I think I'll just stick to optimizing two areas: math and IO. I can optimize a lot of the math because I happen to be pretty good at it (I'm not bragging when I say this, I really love math). I also know the tolerances I'll accept so I can do many operations before I put them in code.&#60;/p&#62;
&#60;blockquote&#62;&#60;p&#62;It is a good idea to be clear about speed, size or some other performance quality.&#60;/p&#62;&#60;/blockquote&#62;
&#60;p&#62;I generally mean speed, though I also meant size here. I will try to specify from now on though.&#60;/p&#62;
&#60;p&#62;Do you know which core files/libraries I can look at to get a better idea of port manipulation?
&#60;/p&#62;</description>
		</item>
		<item>
			<title>gbulmer on "Code Writing Level"</title>
			<link>http://forums.leaflabs.com/topic.php?id=269&amp;page=2#post-2097</link>
			<pubDate>Thu, 28 Oct 2010 17:07:31 +0000</pubDate>
			<dc:creator>gbulmer</dc:creator>
			<guid isPermaLink="false">2097@http://forums.leaflabs.com/</guid>
			<description>&#60;p&#62;Silntknight&#60;/p&#62;
&#60;blockquote&#62;&#60;p&#62;I'm also curious about direct registry access for pins (like Arduino's DDR &#38;amp; PORT). I know Maple doesn't support direct registry access (&#60;a href=&#34;http://forums.leaflabs.com/topic.php?id=268&#34; rel=&#34;nofollow&#34;&#62;http://forums.leaflabs.com/topic.php?id=268&#60;/a&#62;) but if I created methods for this type of access, would that increase performance?&#60;/p&#62;
&#60;/blockquote&#62;
&#60;p&#62;poslathian talks about register access on thread &#60;a href=&#34;http://forums.leaflabs.com/topic.php?id=268&#34;&#62;http://forums.leaflabs.com/topic.php?id=268&#60;/a&#62;&#60;/p&#62;
&#60;p&#62;The Maple libraries hide direct register access, but, as long as you are careful you can use direct register access. For example, use pinMode to get the pin in the right mode, then use direct register access to manipulate the pin.&#60;/p&#62;
&#60;p&#62;Some of the registers are already named in Maple headers.&#60;/p&#62;
&#60;p&#62;Direct access can make a huge difference over the speed of using some of the libraries.&#60;/p&#62;
&#60;p&#62;digitalWrite or digitalRead have function calls, then check that the pin number is valid, and convert the Maple pin number to the actual port and pin. This isn't very slow, but is slower than going directly to the pin.&#60;/p&#62;
&#60;p&#62;For example:&#60;br /&#62;
&#60;pre&#62;&#60;code&#62;void digitalWrite(uint8 pin, uint8 val) {
    if (pin &#38;gt;= NR_GPIO_PINS) {
        return;
    }

    gpio_write_bit(PIN_MAP[pin].port, PIN_MAP[pin].pin, val);
}&#60;/code&#62;&#60;/pre&#62;
&#60;p&#62;Then&#60;br /&#62;
&#60;pre&#62;&#60;code&#62;static inline void gpio_write_bit(GPIO_Port *port, uint8 gpio_pin, uint8 val) {
    if (val){
        port-&#38;gt;BSRR = BIT(gpio_pin);
    } else {
        port-&#38;gt;BRR = BIT(gpio_pin);
    }
}&#60;/code&#62;&#60;/pre&#62;
&#60;p&#62;Then&#60;br /&#62;
&#60;code&#62;#define BIT(shift)                     (1UL &#38;lt;&#38;lt; (shift))&#60;/code&#62;&#60;/p&#62;
&#60;p&#62;if you know the address of the register, e.g.&#60;br /&#62;
#define GPIOA (0x40010800)&#60;br /&#62;
#define GPIOA_BSRR (GPIOA+0x10)&#60;br /&#62;
#define SPARK_PIN (0b00000000001000000)&#60;/p&#62;
&#60;p&#62;  GPIOx_BSRR = (0xFFFF0000 &#124; SPARK_PIN);      // set pin on&#60;br /&#62;
  GPIOx_BSRR = (SPARK_PIN &#38;lt;&#38;lt; 16)              // set pin off;&#60;br /&#62;
`&#60;br /&#62;
These will each compile to a single instruction run in 1 or 2 cycles.&#60;br /&#62;
The difference is even more significant if several pins on the same port are being changed.&#60;/p&#62;
&#60;p&#62;(If I remember, I'll run this into an oscilloscope.)&#60;/p&#62;
&#60;p&#62;I haven't had a look at the code produced by the compiler for digitalWrite, but this will be significantly faster.&#60;/p&#62;
&#60;p&#62;The differences between direct access and analogRead are even bigger because analogRead blocks while the value is being sampled and converted. I guess 90%+ of the time spent inside analogRead is just waiting doing nothing.&#60;/p&#62;
&#60;p&#62;As far as writing assembler. I do know folks who are very good at it. But, unless you *really* know what you are doing, don't use assembler.&#60;br /&#62;
It is feasible that you will do something that prevents the compiler from optimising the code, so clumsy assembler may make things slower.&#60;/p&#62;
&#60;p&#62;Machine code is just numbers, and is &#60;em&#62;exactly&#60;/em&#62; the same stuff as the assembler generates. Writing machine code is just a very hard way to write the numeric values that assembler produces for you.&#60;/p&#62;
&#60;p&#62;As josheeg says, if you really want to turn something into assembler, write C code, then look at the assembler produced by the compiler. &#60;/p&#62;
&#60;p&#62;If the application you've been describing in the other threads is representative of what you want to do, then IMHO you'd get &#60;em&#62;much&#60;/em&#62; better value from investigating how to use the on-board peripherals, e.g. timers. &#60;/p&#62;
&#60;blockquote&#62;&#60;p&#62;I learned that writing in lower-level code is better for performance, but to what extent is this true? How much of a gain can be expected if everything compared to nothing was written in low-level code.&#60;/p&#62;
&#60;/blockquote&#62;
&#60;p&#62;I assume you mean faster by &#34;better for performance&#34;? It is a good idea to be clear about speed, size or some other performance quality.&#60;/p&#62;
&#60;p&#62;A good software engineering rule of thumb is more than 80% of the run time is spent in less than 20% of the code.&#60;/p&#62;
&#60;p&#62;So, rewriting the 80% which only takes 20% of the run time is highly unlikely to show a useful improvement, even if it goes 5x faster, the overall run time has gone down to 84%, and was probably not worth the effort.&#60;/p&#62;
&#60;p&#62;Further, there is a &#60;em&#62;LOT&#60;/em&#62; of evidence that developers are not very succesful at choosing the right part of the program to optimise ahead of writing it. Further, we are not much better without careful measurement, and lots of developers are quite bad at doing those careful measurements.&#60;/p&#62;
&#60;p&#62;Anyway. The only parts worth considering are the 20% that dominate. It is often true that using a better algorithm makes more difference than hand-crafting assembler code. For example, choosing a faster sort algorithm instead of a slower algorithm. Even trying different compiler optimisation flags may do the trick.
&#60;/p&#62;</description>
		</item>
		<item>
			<title>Silntknight on "Code Writing Level"</title>
			<link>http://forums.leaflabs.com/topic.php?id=269#post-2090</link>
			<pubDate>Wed, 27 Oct 2010 22:31:16 +0000</pubDate>
			<dc:creator>Silntknight</dc:creator>
			<guid isPermaLink="false">2090@http://forums.leaflabs.com/</guid>
			<description>&#60;p&#62;Well this gives me something to think about. Josheeg, I also choose the Maple because of its added capabilities compared to the Arduino.&#60;/p&#62;
&#60;p&#62;Gbulmer, given your explanation, I don't actually have anything that could use #define. At least, there is nothing worth changing the code for. Hope to hear more soon about the other parts of the question.
&#60;/p&#62;</description>
		</item>
		<item>
			<title>josheeg on "Code Writing Level"</title>
			<link>http://forums.leaflabs.com/topic.php?id=269#post-2088</link>
			<pubDate>Wed, 27 Oct 2010 20:17:27 +0000</pubDate>
			<dc:creator>josheeg</dc:creator>
			<guid isPermaLink="false">2088@http://forums.leaflabs.com/</guid>
			<description>&#60;p&#62;I would guess writing in a level like c or arduino a little higher can be fine for the adverage go to the grocery store and get a container of homus and flour and make some bread.&#60;br /&#62;
Now if you needed to optimise a small loop then asm and machine code seem to be the same. Also they might be well writen by the compiler so the only thing that could be done at that point is to take apart the c and compare.&#60;br /&#62;
Also consider the value of time and cost if time has no value shure write it in asm after comparing it with c.&#60;br /&#62;
But then depending on the size of the system memory management etc. It could be better to tell the compiler to compile and use more ram or rom and make  faster code. I think there were switches for that.&#60;/p&#62;
&#60;p&#62;It is similar to my problem I had a lot of sensor data too much for a arduino and too much to send by a teensy++ and too much to process on the fly.&#60;/p&#62;
&#60;p&#62;So I got the usb1232h module a high speed 8 bit parrelllel out usb module.&#60;br /&#62;
&#38;amp; the maple to control the bits and load the register, operate system clock &#38;amp; etc.&#60;/p&#62;
&#60;p&#62;So that answer was to throw hardware at the problem.
&#60;/p&#62;</description>
		</item>
		<item>
			<title>gbulmer on "Code Writing Level"</title>
			<link>http://forums.leaflabs.com/topic.php?id=269#post-2080</link>
			<pubDate>Wed, 27 Oct 2010 19:25:13 +0000</pubDate>
			<dc:creator>gbulmer</dc:creator>
			<guid isPermaLink="false">2080@http://forums.leaflabs.com/</guid>
			<description>&#60;p&#62;Silntknight - cracking questions!&#60;/p&#62;
&#60;p&#62;Let me do one, then I'm off to bed.&#60;/p&#62;
&#60;p&#62;&#60;code&#62;#define&#60;/code&#62; - this is executed at compile time, and generates values for the compiler.&#60;br /&#62;
So&#60;br /&#62;
&#60;pre&#62;&#60;code&#62;#define MAX (16367)
 //...
 for (int i=0; i&#38;lt;MAX; ++i) {
   c = MAX*i;
 }&#60;/code&#62;&#60;/pre&#62;
&#60;p&#62;turns into&#60;br /&#62;
&#60;pre&#62;&#60;code&#62;for (int i=0; i&#38;lt;(16367); ++i) {
   c = (16367)*i;
 }&#60;/code&#62;&#60;/pre&#62;
&#60;p&#62;&#60;em&#62;before&#60;/em&#62; the compiler takes a look.&#60;br /&#62;
Conceptially a program called the preprocessor (cpp) replaces the #define name with literal text, in this case a number, but can be any valid text, before the text goes to the compiler. The preprocessor also does #include, #if, #ifdef, etc.&#60;/p&#62;
&#60;p&#62;Nowadays the preprocessor is often built into the compiler, but the semantics are preserved, i.e. the preprocessor gets to the program text first.&#60;/p&#62;
&#60;p&#62;So it is no possible to write:&#60;br /&#62;
&#60;pre&#62;&#60;code&#62;for (int i=0; i&#38;lt;MAX; ++i) {
   MAX = c*i;
 }&#60;/code&#62;&#60;/pre&#62;
&#60;p&#62;as that would become:&#60;br /&#62;
&#60;pre&#62;&#60;code&#62;for (int i=0; i&#38;lt;(16367); ++i) {
   (16367) = c*i;
 }&#60;/code&#62;&#60;/pre&#62;
&#60;p&#62;which is not C.&#60;br /&#62;
In this case it doesn't take up data memory (though that is processor and compiler dependent).&#60;/p&#62;
&#60;p&#62;&#60;code&#62;int MAX2 = 16367;&#60;/code&#62;&#60;br /&#62;
creates a named variable.&#60;br /&#62;
It takes up data memory space, and can be assigned new values, e.g. &#60;code&#62;int MAX2 = MAX2+1;&#60;/code&#62;&#60;/p&#62;
&#60;p&#62;The other form is:&#60;br /&#62;
&#60;code&#62;const int MAX3 = 16367;&#60;/code&#62;&#60;br /&#62;
This also takes up data memory (usually), but the const tells the compiler to prevent its value from changing.&#60;/p&#62;
&#60;p&#62;Key differences between&#60;br /&#62;
&#60;code&#62;#define MAX (16367)&#60;/code&#62;&#60;br /&#62;
and&#60;br /&#62;
&#60;code&#62;const int MAX3 = 16367;&#60;/code&#62;&#60;br /&#62;
is MAX3 has a real data type, a size, and a memory address (&#38;amp;MAX3 is meaningful).&#60;/p&#62;
&#60;p&#62;Some older compilers that I have used do not let you say:&#60;br /&#62;
&#60;pre&#62;&#60;code&#62;const int MAX3 = 100;
int a[MAX3];&#60;/code&#62;&#60;/pre&#62;
&#60;p&#62;which forced the use of &#60;code&#62;#define&#60;/code&#62; to set the size of the array.&#60;/p&#62;
&#60;p&#62;#define is very general purpose, as it is inserting pieces of text, and can be dangerous.&#60;/p&#62;
&#60;p&#62;I tend to write &#60;code&#62;const int MAX3 = 100;&#60;/code&#62; when I am writing code for other people who may not be aware of #define and the dangers of using it.
&#60;/p&#62;</description>
		</item>
		<item>
			<title>Silntknight on "Code Writing Level"</title>
			<link>http://forums.leaflabs.com/topic.php?id=269#post-2073</link>
			<pubDate>Wed, 27 Oct 2010 17:31:29 +0000</pubDate>
			<dc:creator>Silntknight</dc:creator>
			<guid isPermaLink="false">2073@http://forums.leaflabs.com/</guid>
			<description>&#60;p&#62;This is primarily to address the difference between &#60;code&#62;#define&#60;/code&#62; and the &#34;normal&#34; method of declaring variables. Which is preferable to use? Because everything gets compiled anyway, does it matter? I'm also curious about direct registry access for pins (like Arduino's DDR &#38;amp; PORT). I know Maple doesn't support direct registry access (&#60;a href=&#34;http://forums.leaflabs.com/topic.php?id=268&#34; rel=&#34;nofollow&#34;&#62;http://forums.leaflabs.com/topic.php?id=268&#60;/a&#62;) but if I created methods for this type of access, would that increase performance?&#60;/p&#62;
&#60;p&#62;I learned that writing in lower-level code is better for performance, but to what extent is this true? How much of a gain can be expected if everything compared to nothing was written in low-level code.
&#60;/p&#62;</description>
		</item>

	</channel>
</rss>
