Page 1 of 1
sprintf speed nightmare
Posted: Wed Sep 14, 2016 8:24 am
by matteus
Code: Select all
sprintf(Verse1.charLine1, "%s %s", Lyrics.charLine1Part1[randomNumberGenerator(10)], Lyrics.charLine1Part2[randomNumberGenerator(10)]);
sprintf(Verse1.charLine2, "%s %s", Lyrics.charLine2Part1[randomNumberGenerator(10)], Lyrics.charLine2Part2[randomNumberGenerator(10)]);
sprintf(Verse1.charLine3, "%s", Lyrics.charLine3[randomNumberGenerator(10)]);
sprintf(Verse1.charLine4, "%s", Lyrics.charLine4[randomNumberGenerator(10)]);
sprintf(Verse2.charLine1, "%s %s", Lyrics.charLine1Part1[randomNumberGenerator(10)], Lyrics.charLine1Part2[randomNumberGenerator(10)]);
sprintf(Verse2.charLine2, "%s %s", Lyrics.charLine2Part1[randomNumberGenerator(10)], Lyrics.charLine2Part2[randomNumberGenerator(10)]);
sprintf(Verse2.charLine3, "%s", Lyrics.charLine3[randomNumberGenerator(10)]);
sprintf(Verse2.charLine4, "%s", Lyrics.charLine4[randomNumberGenerator(10)]);
sprintf(Verse3.charLine1, "%s %s", Lyrics.charLine1Part1[randomNumberGenerator(10)], Lyrics.charLine1Part2[randomNumberGenerator(10)]);
sprintf(Verse3.charLine2, "%s %s", Lyrics.charLine2Part1[randomNumberGenerator(10)], Lyrics.charLine2Part2[randomNumberGenerator(10)]);
sprintf(Verse3.charLine3, "%s", Lyrics.charLine3[randomNumberGenerator(10)]);
I have the following code that seems to take an age to run! I'm guessing it's something to do with the memory speed?
Re: sprintf speed nightmare
Posted: Wed Sep 14, 2016 1:45 pm
by Stef
It's just that sprintf is a *very slow* method (which use an internal interpreter) specially on a system like the genesis

Re: sprintf speed nightmare
Posted: Wed Sep 14, 2016 5:40 pm
by cero
That would also be slow on a PC, but the 4GHz speed is excellent at hiding bad coding
Code: Select all
sprintf(Verse3.charLine3, "%s", Lyrics.charLine3[randomNumberGenerator(10)]);
Printing just one string, with no modifications of any kind, is quite wasteful this way. You should use strcpy in those cases.
edit: Modern GCC optimizes it automatically. Not sure about the old gcc 3.
Re: sprintf speed nightmare
Posted: Wed Sep 14, 2016 7:28 pm
by Stef
Almost certain GCC 3 does not optimize it

Re: sprintf speed nightmare
Posted: Thu Sep 15, 2016 8:52 am
by matteus
Code: Select all
strcpy(Verse1.charLine1Part1, Lyrics.charLine1Part1[randomNumberGenerator(10)]);
strcpy(Verse1.charLine2Part1, Lyrics.charLine1Part1[randomNumberGenerator(10)]);
SYS_disableInts();
VDP_drawText(Verse1.charLine1Part1, SONG_TEXT_START_COLUMN, SONG_TEXT_START_ROW+7);
VDP_drawText(Lyrics.charLine1Part2[randomNumberGenerator(10)], SONG_TEXT_START_COLUMN+strlen(Verse1.charLine1Part1)+1, SONG_TEXT_START_ROW+7);
VDP_drawText(Verse1.charLine2Part1, SONG_TEXT_START_COLUMN, SONG_TEXT_START_ROW+8);
VDP_drawText(Lyrics.charLine1Part2[randomNumberGenerator(10)], SONG_TEXT_START_COLUMN+strlen(Verse1.charLine2Part1)+1, SONG_TEXT_START_ROW+8);
VDP_drawText(Lyrics.charLine3[randomNumberGenerator(10)], SONG_TEXT_START_COLUMN, SONG_TEXT_START_ROW+9);
VDP_drawText(Lyrics.charLine4[randomNumberGenerator(10)], SONG_TEXT_START_COLUMN, SONG_TEXT_START_ROW+10);
SYS_enableInts();
So is this any better?
Re: sprintf speed nightmare
Posted: Thu Sep 15, 2016 9:46 am
by cero
Yes, that's much faster.
Re: sprintf speed nightmare
Posted: Thu Sep 15, 2016 8:12 pm
by matteus
Noticeable too!

Thank you so much
Re: sprintf speed nightmare
Posted: Sun Sep 18, 2016 10:51 am
by KanedaFr
Is there a reason for you to use
Code: Select all
strcpy(Verse1.charLine1Part1, Lyrics.charLine1Part1[randomNumberGenerator(10)]);
...
VDP_drawText(Verse1.charLine1Part1, SONG_TEXT_START_COLUMN, SONG_TEXT_START_ROW+7);
and not
Code: Select all
VDP_drawText( Lyrics.charLine1Part1[randomNumberGenerator(10)], SONG_TEXT_START_COLUMN, SONG_TEXT_START_ROW+7);
?
From your code snipped, I don't see the need to use strcpy...
if it's for you to keep the string for another use, you should perhaps better save the result of randomNumberGenerator(10) than to store a string
no ?
Re: sprintf speed nightmare
Posted: Mon Sep 19, 2016 5:02 pm
by matteus
You'll notice further down I used a strlen on Verse1.charLine1Part1, I have to store this in char to get it's length later on in the code
