I did some timing & power consumption measurements with a couple of SD cards.
My setup is not perfect, don't have a scope set up, so just did reads and writes in a loop for 10 seconds, and measured the power consumption.
Hardware:
USB port :)
Ruideng UM25C to measure the current consumption. 100uA resolution. Don't know about it's absolute accuracy, but the values are pretty consistent. Update speed could be a bit faster...
Pixl.JS 2v04
SD card adapter, wire length is about 10cm
SD Cards:
really old TwinMos 128Mb card
Sandisk Ultra 32Gb (got it like 5-6 years ago)
Sandisk EDGE 16Gb (got it last year with a Raspberry Pi bundle)
Tests done:
append a 46 character long line to an existing file (to simulate adding a new line to a log file. This is my original use case)
read a 4 character file
read a 334 character long file
A helper function (runs the funk function continuously for seconds seconds, and returns how many times it had executed):
function doFor(seconds, funk) {
if (isNaN(seconds)) {throw new Error("seconds NaN!")}
if (!(typeof funk === 'function')) {throw new Error("funk ! function!")}
// warmup
funk();
var endT = (new Date()).getTime() + 1000 * seconds;
var ts = 0;
while ((new Date()).getTime() < endT) {funk(); ts++;}
return ts;
}
Test values and files for perf measurements:
// two test files, one is 4 characters long, the other is 334 characters long Lorem Ipsum :)
fs.writeFile("4ch.txt", "alma")
fs.writeFile("334ch.txt", `In publishing and graphic design, Lorem ipsum is a placeholder text commonly used to demonstrate the visual form of a document without relying on meaningful content (also called greeking).Replacing the actual content with placeholder text allows designers to design the form of the content before the content itself has been produced.`)
// just a row of data
sor = "Thu Jan 1 1970 00:06:43 GMT+0000,100,22.5,233\n"
// reading the files:
doFor(10, function(){fs.readFile("4ch.txt")})
doFor(10, function(){fs.readFile("334ch.txt")})
// writing data:
doFor(10, function(){fs.appendFile("teszt.txt", sor)})
Baseline power consumption:
Pixl idle, no BLE connection, LCD on: 100uA
Pixl idle, BLE connected: 0.9-1mA
Pixl idle, BLE disconnected after writing 128Mb (SD mounted, LCD off): 2-300uA
Pixl idle, BLE disconnected after writing 32Gb Sandisk (same if SD still mounted or unmounted): 5-600uA
Pixl idle, BLE disconnected after writing 32Gb Sandisk (SD unmounted, LCD off): 3-400uA
Pixl connected & running in a loop doFor(10, function(){}): 8.4mA
Some surprises:
all cards work just fine at 8MHz SPI clock with this setup. (altho' I didn't check every single byte, data seems to be OK on all cards...)
reading 4 bytes of data takes almost as much time as reading 334 bytes. Ok, probably isn't surprising if someone knows that data is stored in sectors...
the old 128Mb card beats the 16Gb Sandisk in both speed and power consumption. Beats the newer card even more, if we adjust the power consumption for read/write speed.
The 32Gb Sandisk Ultra is faster, and consumes more power.
But if we assume that a single read or write takes the propotionally less time, it's overall energy consumption is lower, if we go to 1MHz reads and 2MHz writes and above. Write energy consumption:
18mA, 14.8 write/sec with the old card -> 1.22 mili-amper-second for one write
31.2mA, 27.4 write/sec with the 32Gb card -> 1.14 mili-amper-second for one write
So looks like the fastest card at the highest speed is the winner?
But 30mA current is a bit high if you run on a coin cell. Or might not matter, because a capacitor could smooth out a single write-spike? Dunno, I guess that's the point where a proper setup with an oscilloscope would be handy.
Espruino is a JavaScript interpreter for low-power Microcontrollers. This site is both a support community for Espruino and a place to share what you are working on.
I did some timing & power consumption measurements with a couple of SD cards.
My setup is not perfect, don't have a scope set up, so just did reads and writes in a loop for 10 seconds, and measured the power consumption.
Hardware:
SD Cards:
Tests done:
A helper function (runs the
funk
function continuously forseconds
seconds, and returns how many times it had executed):Test values and files for perf measurements:
Baseline power consumption:
doFor(10, function(){})
: 8.4mASome surprises:
The 32Gb Sandisk Ultra is faster, and consumes more power.
But if we assume that a single read or write takes the propotionally less time, it's overall energy consumption is lower, if we go to 1MHz reads and 2MHz writes and above. Write energy consumption:
So looks like the fastest card at the highest speed is the winner?
But 30mA current is a bit high if you run on a coin cell. Or might not matter, because a capacitor could smooth out a single write-spike? Dunno, I guess that's the point where a proper setup with an oscilloscope would be handy.
Raw data in the attachment
1 Attachment