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 :)