[Ffmpeg-devel] [RFC] av_random...

Ryan Martell rdm4
Tue Jan 9 23:03:21 CET 2007


On Jan 9, 2007, at 3:14 PM, Michael Niedermayer wrote:
> On Tue, Jan 09, 2007 at 02:13:51PM -0600, Ryan Martell wrote:
>> On Jan 8, 2007, at 8:24 PM, Michael Niedermayer wrote:
>>> On Mon, Jan 08, 2007 at 11:56:24AM -0600, Ryan Martell wrote:
>>> [...]
> [...]
>> #ifdef DEBUG
>> void av_benchmark_random(void)
>> {
>>     int i;
>>     AVRandomState state;
>>
>>     av_init_random(0xdeadbeef, &state);
>>
>>     av_log(NULL, AV_LOG_ERROR, "1000 outputs of av_random()\n");
>>     {
>>         START_TIMER;
>>         for (i = 0; i < 1000; i++) {
>>             av_random(&state);
>>         }
>>         STOP_TIMER("1000 calls of av_random");
>
> this should rather be
>     int x=0;
>     for (j = 0; j < 100; j++) {
>         START_TIMER;
>         x+= av_random(&state);
>         STOP_TIMER("first call to av_random");
>         for (i = 1; i < AV_RANDOM_N; i++) {
>             START_TIMER;
>             x+= av_random(&state);
>             STOP_TIMER("AV_RANDOM_N calls of av_random");
>         }
>     }
>     av_log(NULL, AV_LOG_ERROR, "final value:%X\n", x);
>
> without the x, the compiler can simply optimize the whole av_random 
> () out
> (gcc of course is too stupid to do this but still it might remove a  
> few
> operations at random)
>
> and spliting the quick and slow cases provides more information, also
> *_TIMER is designed for code which is approxiately equally fast on  
> each
> run and thats where it provides the best accuracy ...
>
> printing the final value gives some regression test (a simple if 
> (x==expected)
> ould be fine too, the thing that is important is that x is used  
> otherwise
> a compiler could remove x and the whole av_random())

Gotcha.

> except that the code looks good ...

Okay, changed (and attached).

For the record, the timing units I sent before were only timing the  
generate_untempered function, since it's only called every  
AV_RANDOM_N times av_random is called.

Final question: typically, I use time(NULL) to initialize the seeds  
of a random number generator.  Since ffmpeg says don't use time 
(NULL), what's the best pseodo-random seed generator to use?


-------------- next part --------------
A non-text attachment was scrubbed...
Name: random.c
Type: application/octet-stream
Size: 3516 bytes
Desc: not available
URL: <http://lists.mplayerhq.hu/pipermail/ffmpeg-devel/attachments/20070109/ff390857/attachment.obj>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: random.h
Type: application/octet-stream
Size: 2408 bytes
Desc: not available
URL: <http://lists.mplayerhq.hu/pipermail/ffmpeg-devel/attachments/20070109/ff390857/attachment-0001.obj>



More information about the ffmpeg-devel mailing list