* [FFmpeg-devel] AVDictionary vs. AVSet (AVDictionary2 approximation) @ 2025-04-14 11:33 Michael Niedermayer 2025-04-14 12:40 ` softworkz . 0 siblings, 1 reply; 5+ messages in thread From: Michael Niedermayer @ 2025-04-14 11:33 UTC (permalink / raw) To: FFmpeg development discussions and patches [-- Attachment #1.1: Type: text/plain, Size: 2709 bytes --] Hi I just posted a AVSet implementation i wrote in the last 2 days (yes thats why i did dissapear for the last 2 days) My plan was to use that AVSet as basis for AVDictionary2 in case benchmarks indicate that its worth it, so is it ? with 3 entries (100000 runs) AVDictionary 0.040sec AVSet 0.027sec with 5 entries (100000 runs) AVDictionary 0.065sec AVSet 0.042sec with 10 entries (100000 runs) AVDictionary 0.193sec AVSet 0.087sec with 100 entries (100000 runs) AVDictionary 8.7 sec AVSet 1.4 sec with 1000 entries (1000 runs) AVDictionary 8.0 sec AVSet 0.240 sec with 10000 entries (10 runs) AVDictionary 7.2 sec AVSet 0.042 sec I was a bit surprised for the 3 and 5 entry case, maybe my benchmark is buggy or AVSet is, but then AVDictionary is pretty bad with memory allocations AVDictionary needs to strdup every key and value, needs to allocate the AVDictionary itself and reallocs the entry array each time thats 10 memory allocation related calls for adding 3 entries while AVSet allocates the AVSet and then uses av_fast_realloc() for the array and theres nothing else, the key/value goes in that array too bechmark code used is below: #if 0 for (int runs = 0; runs < 100000; runs++) { AVSet *set = av_set_new(strcmp, NULL, NULL); for(int pass = 0; pass < 2; pass++) { unsigned r = 5; for(int i=0; i<100; i++) { r = r*123 + 7; char str[2*7] = "TESTXXTESTXX"; str[4] = r; str[5] = r>>8; if(pass == 0) { av_set_add(set, str, 2*7, 0); } else { av_set_get(set, NULL, str, NULL); } } } av_set_free(&set); } #else for (int runs = 0; runs < 100000; runs++) { AVDictionary *dict = NULL; for(int pass = 0; pass < 2; pass++) { unsigned r = 5; for(int i=0; i<100; i++) { r = r*123 + 7; char str[7] = "TEST"; str[4] = r; str[5] = r>>8; if(pass == 0) { av_dict_set(&dict, str, str, 0); } else { av_dict_get(dict, str, NULL, 0); } } } av_dict_free(&dict); } #endif -- Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB Good people do not need laws to tell them to act responsibly, while bad people will find a way around the laws. -- Plato [-- Attachment #1.2: signature.asc --] [-- Type: application/pgp-signature, Size: 195 bytes --] [-- Attachment #2: Type: text/plain, Size: 251 bytes --] _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe". ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [FFmpeg-devel] AVDictionary vs. AVSet (AVDictionary2 approximation) 2025-04-14 11:33 [FFmpeg-devel] AVDictionary vs. AVSet (AVDictionary2 approximation) Michael Niedermayer @ 2025-04-14 12:40 ` softworkz . 2025-04-14 13:02 ` softworkz . 0 siblings, 1 reply; 5+ messages in thread From: softworkz . @ 2025-04-14 12:40 UTC (permalink / raw) To: FFmpeg development discussions and patches > -----Original Message----- > From: ffmpeg-devel <ffmpeg-devel-bounces@ffmpeg.org> On Behalf Of > Michael Niedermayer > Sent: Montag, 14. April 2025 13:33 > To: FFmpeg development discussions and patches <ffmpeg- > devel@ffmpeg.org> > Subject: [FFmpeg-devel] AVDictionary vs. AVSet (AVDictionary2 > approximation) > > Hi > > I just posted a AVSet implementation i wrote in the last 2 days (yes > thats > why i did dissapear for the last 2 days) > > My plan was to use that AVSet as basis for AVDictionary2 in case > benchmarks indicate that its worth it, so is it ? > > with 3 entries (100000 runs) > AVDictionary 0.040sec > AVSet 0.027sec > > with 5 entries (100000 runs) > AVDictionary 0.065sec > AVSet 0.042sec > > with 10 entries (100000 runs) > AVDictionary 0.193sec > AVSet 0.087sec > > with 100 entries (100000 runs) > AVDictionary 8.7 sec > AVSet 1.4 sec > > with 1000 entries (1000 runs) > AVDictionary 8.0 sec > AVSet 0.240 sec > > with 10000 entries (10 runs) > AVDictionary 7.2 sec > AVSet 0.042 sec > > > I was a bit surprised for the 3 and 5 entry case, maybe my benchmark > is buggy or > AVSet is, but then AVDictionary is pretty bad with memory allocations > > AVDictionary needs to strdup every key and value, needs to allocate > the AVDictionary itself and reallocs the entry array each time > thats 10 memory allocation related calls for adding 3 entries > > while AVSet allocates the AVSet and then uses av_fast_realloc() for > the array > and theres nothing else, the key/value goes in that array too > > > bechmark code used is below: > > > #if 0 > for (int runs = 0; runs < 100000; runs++) { > AVSet *set = av_set_new(strcmp, NULL, NULL); > for(int pass = 0; pass < 2; pass++) { > unsigned r = 5; > for(int i=0; i<100; i++) { > r = r*123 + 7; > char str[2*7] = "TESTXXTESTXX"; > str[4] = r; > str[5] = r>>8; > if(pass == 0) { > av_set_add(set, str, 2*7, 0); > } else { > av_set_get(set, NULL, str, NULL); > } > } > } > av_set_free(&set); > } > #else > for (int runs = 0; runs < 100000; runs++) { > AVDictionary *dict = NULL; > for(int pass = 0; pass < 2; pass++) { > unsigned r = 5; > for(int i=0; i<100; i++) { > r = r*123 + 7; > char str[7] = "TEST"; > str[4] = r; > str[5] = r>>8; > if(pass == 0) { > av_dict_set(&dict, str, str, 0); > } else { > av_dict_get(dict, str, NULL, 0); > } > } > } > av_dict_free(&dict); > } > #endif > > > -- Hi Michael, what's not quite realistic is that all keys are starting with the same 4 characters. This affects the lookups of course - and probably (maybe) not equally for both sides. Doesn't the code create duplicate keys (at least when it gets > 65536 it will for sure) ? So, I think, the keys should be completely random (all chars). I would also check whether the lookups are successful (just to be sure). Best, sw _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe". ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [FFmpeg-devel] AVDictionary vs. AVSet (AVDictionary2 approximation) 2025-04-14 12:40 ` softworkz . @ 2025-04-14 13:02 ` softworkz . 2025-04-15 19:11 ` Michael Niedermayer 0 siblings, 1 reply; 5+ messages in thread From: softworkz . @ 2025-04-14 13:02 UTC (permalink / raw) To: FFmpeg development discussions and patches > -----Original Message----- > From: ffmpeg-devel <ffmpeg-devel-bounces@ffmpeg.org> On Behalf Of > softworkz . > Sent: Montag, 14. April 2025 14:40 > To: FFmpeg development discussions and patches <ffmpeg- > devel@ffmpeg.org> > Subject: Re: [FFmpeg-devel] AVDictionary vs. AVSet (AVDictionary2 > approximation) > > > > > -----Original Message----- > > From: ffmpeg-devel <ffmpeg-devel-bounces@ffmpeg.org> On Behalf Of > > Michael Niedermayer > > Sent: Montag, 14. April 2025 13:33 > > To: FFmpeg development discussions and patches <ffmpeg- > > devel@ffmpeg.org> > > Subject: [FFmpeg-devel] AVDictionary vs. AVSet (AVDictionary2 > > approximation) > > > > Hi > > > > I just posted a AVSet implementation i wrote in the last 2 days (yes > > thats > > why i did dissapear for the last 2 days) > > > > My plan was to use that AVSet as basis for AVDictionary2 in case > > benchmarks indicate that its worth it, so is it ? > > > > with 3 entries (100000 runs) > > AVDictionary 0.040sec > > AVSet 0.027sec > > > > with 5 entries (100000 runs) > > AVDictionary 0.065sec > > AVSet 0.042sec > > > > with 10 entries (100000 runs) > > AVDictionary 0.193sec > > AVSet 0.087sec > > > > with 100 entries (100000 runs) > > AVDictionary 8.7 sec > > AVSet 1.4 sec > > > > with 1000 entries (1000 runs) > > AVDictionary 8.0 sec > > AVSet 0.240 sec > > > > with 10000 entries (10 runs) > > AVDictionary 7.2 sec > > AVSet 0.042 sec > > > > > > I was a bit surprised for the 3 and 5 entry case, maybe my benchmark > > is buggy or > > AVSet is, but then AVDictionary is pretty bad with memory > allocations > > > > AVDictionary needs to strdup every key and value, needs to allocate > > the AVDictionary itself and reallocs the entry array each time > > thats 10 memory allocation related calls for adding 3 entries > > > > while AVSet allocates the AVSet and then uses av_fast_realloc() for > > the array > > and theres nothing else, the key/value goes in that array too > > > > > > bechmark code used is below: > > > > > > #if 0 > > for (int runs = 0; runs < 100000; runs++) { > > AVSet *set = av_set_new(strcmp, NULL, NULL); > > for(int pass = 0; pass < 2; pass++) { > > unsigned r = 5; > > for(int i=0; i<100; i++) { > > r = r*123 + 7; > > char str[2*7] = "TESTXXTESTXX"; > > str[4] = r; > > str[5] = r>>8; > > if(pass == 0) { > > av_set_add(set, str, 2*7, 0); > > } else { > > av_set_get(set, NULL, str, NULL); > > } > > } > > } > > av_set_free(&set); > > } > > #else > > for (int runs = 0; runs < 100000; runs++) { > > AVDictionary *dict = NULL; > > for(int pass = 0; pass < 2; pass++) { > > unsigned r = 5; > > for(int i=0; i<100; i++) { > > r = r*123 + 7; > > char str[7] = "TEST"; > > str[4] = r; > > str[5] = r>>8; > > if(pass == 0) { > > av_dict_set(&dict, str, str, 0); > > } else { > > av_dict_get(dict, str, NULL, 0); > > } > > } > > } > > av_dict_free(&dict); > > } > > #endif > > > > > > -- > > Hi Michael, > > > what's not quite realistic is that all keys are starting with the same > 4 characters. This affects the lookups of course - and probably > (maybe) not equally for both sides. > > Doesn't the code create duplicate keys (at least when it gets > 65536 > it will for sure) ? > > So, I think, the keys should be completely random (all chars). > > I would also check whether the lookups are successful (just to be > sure). Sorry, I forgot the most important one: Timing for population and lookup should be measured separately.. sw _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe". ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [FFmpeg-devel] AVDictionary vs. AVSet (AVDictionary2 approximation) 2025-04-14 13:02 ` softworkz . @ 2025-04-15 19:11 ` Michael Niedermayer 2025-04-15 20:36 ` Michael Niedermayer 0 siblings, 1 reply; 5+ messages in thread From: Michael Niedermayer @ 2025-04-15 19:11 UTC (permalink / raw) To: FFmpeg development discussions and patches [-- Attachment #1.1: Type: text/plain, Size: 7420 bytes --] On Mon, Apr 14, 2025 at 01:02:00PM +0000, softworkz . wrote: > > > > -----Original Message----- > > From: ffmpeg-devel <ffmpeg-devel-bounces@ffmpeg.org> On Behalf Of > > softworkz . > > Sent: Montag, 14. April 2025 14:40 > > To: FFmpeg development discussions and patches <ffmpeg- > > devel@ffmpeg.org> > > Subject: Re: [FFmpeg-devel] AVDictionary vs. AVSet (AVDictionary2 > > approximation) > > > > > > > > > -----Original Message----- > > > From: ffmpeg-devel <ffmpeg-devel-bounces@ffmpeg.org> On Behalf Of > > > Michael Niedermayer > > > Sent: Montag, 14. April 2025 13:33 > > > To: FFmpeg development discussions and patches <ffmpeg- > > > devel@ffmpeg.org> > > > Subject: [FFmpeg-devel] AVDictionary vs. AVSet (AVDictionary2 > > > approximation) > > > > > > Hi > > > > > > I just posted a AVSet implementation i wrote in the last 2 days (yes > > > thats > > > why i did dissapear for the last 2 days) > > > > > > My plan was to use that AVSet as basis for AVDictionary2 in case > > > benchmarks indicate that its worth it, so is it ? > > > > > > with 3 entries (100000 runs) > > > AVDictionary 0.040sec > > > AVSet 0.027sec > > > > > > with 5 entries (100000 runs) > > > AVDictionary 0.065sec > > > AVSet 0.042sec > > > > > > with 10 entries (100000 runs) > > > AVDictionary 0.193sec > > > AVSet 0.087sec > > > > > > with 100 entries (100000 runs) > > > AVDictionary 8.7 sec > > > AVSet 1.4 sec > > > > > > with 1000 entries (1000 runs) > > > AVDictionary 8.0 sec > > > AVSet 0.240 sec > > > > > > with 10000 entries (10 runs) > > > AVDictionary 7.2 sec > > > AVSet 0.042 sec > > > > > > > > > I was a bit surprised for the 3 and 5 entry case, maybe my benchmark > > > is buggy or > > > AVSet is, but then AVDictionary is pretty bad with memory > > allocations > > > > > > AVDictionary needs to strdup every key and value, needs to allocate > > > the AVDictionary itself and reallocs the entry array each time > > > thats 10 memory allocation related calls for adding 3 entries > > > > > > while AVSet allocates the AVSet and then uses av_fast_realloc() for > > > the array > > > and theres nothing else, the key/value goes in that array too > > > > > > > > > bechmark code used is below: > > > > > > > > > #if 0 > > > for (int runs = 0; runs < 100000; runs++) { > > > AVSet *set = av_set_new(strcmp, NULL, NULL); > > > for(int pass = 0; pass < 2; pass++) { > > > unsigned r = 5; > > > for(int i=0; i<100; i++) { > > > r = r*123 + 7; > > > char str[2*7] = "TESTXXTESTXX"; > > > str[4] = r; > > > str[5] = r>>8; > > > if(pass == 0) { > > > av_set_add(set, str, 2*7, 0); > > > } else { > > > av_set_get(set, NULL, str, NULL); > > > } > > > } > > > } > > > av_set_free(&set); > > > } > > > #else > > > for (int runs = 0; runs < 100000; runs++) { > > > AVDictionary *dict = NULL; > > > for(int pass = 0; pass < 2; pass++) { > > > unsigned r = 5; > > > for(int i=0; i<100; i++) { > > > r = r*123 + 7; > > > char str[7] = "TEST"; > > > str[4] = r; > > > str[5] = r>>8; > > > if(pass == 0) { > > > av_dict_set(&dict, str, str, 0); > > > } else { > > > av_dict_get(dict, str, NULL, 0); > > > } > > > } > > > } > > > av_dict_free(&dict); > > > } > > > #endif > > > > > > > > > -- > > > > Hi Michael, > > > > > > what's not quite realistic is that all keys are starting with the same > > 4 characters. This affects the lookups of course - and probably > > (maybe) not equally for both sides. > > > > Doesn't the code create duplicate keys (at least when it gets > 65536 > > it will for sure) ? > > > > So, I think, the keys should be completely random (all chars). > > > > I would also check whether the lookups are successful (just to be > > sure). > > Sorry, I forgot the most important one: > > Timing for population and lookup should be measured separately.. Sure, for the v2 (AVMap) i just posted with TESTXX / TESTXX strings where XX is random 1000 entries 5354505 decicycles in av_map_add, 512 runs, 0 skips 4040575 decicycles in av_map_get, 512 runs, 0 skips 148082828 decicycles in av_dict_set, 512 runs, 0 skips 145828939 decicycles in av_dict_get, 512 runs, 0 skips 100 entries 332015 decicycles in av_map_add, 512 runs, 0 skips 193726 decicycles in av_map_get, 512 runs, 0 skips 1697242 decicycles in av_dict_set, 512 runs, 0 skips 1392837 decicycles in av_dict_get, 512 runs, 0 skips 10 entries 21142 decicycles in av_map_add, 512 runs, 0 skips 11395 decicycles in av_map_get, 512 runs, 0 skips 45663 decicycles in av_dict_set, 512 runs, 0 skips 19756 decicycles in av_dict_get, 512 runs, 0 skips 5 entries 9210 decicycles in av_map_add, 512 runs, 0 skips 4870 decicycles in av_map_get, 511 runs, 1 skips 18823 decicycles in av_dict_set, 512 runs, 0 skips 5483 decicycles in av_dict_get, 512 runs, 0 skips 3 entries 5693 decicycles in av_map_add, 512 runs, 0 skips 2645 decicycles in av_map_get, 512 runs, 0 skips 11462 decicycles in av_dict_set, 511 runs, 1 skips 2532 decicycles in av_dict_get, 512 runs, 0 skips with XXST / XXST strings where XX is random 1000 entries 5321153 decicycles in av_map_add, 512 runs, 0 skips 4295153 decicycles in av_map_get, 512 runs, 0 skips 70417784 decicycles in av_dict_set, 512 runs, 0 skips 68188612 decicycles in av_dict_get, 512 runs, 0 skips 100 entries 322872 decicycles in av_map_add, 512 runs, 0 skips 216032 decicycles in av_map_get, 511 runs, 1 skips 1022088 decicycles in av_dict_set, 512 runs, 0 skips 723612 decicycles in av_dict_get, 512 runs, 0 skips 10 entries 20993 decicycles in av_map_add, 512 runs, 0 skips 11744 decicycles in av_map_get, 512 runs, 0 skips 38945 decicycles in av_dict_set, 512 runs, 0 skips 11308 decicycles in av_dict_get, 512 runs, 0 skips 5 entries 10007 decicycles in av_map_add, 511 runs, 1 skips 5004 decicycles in av_map_get, 512 runs, 0 skips 17374 decicycles in av_dict_set, 511 runs, 1 skips 3848 decicycles in av_dict_get, 512 runs, 0 skips 3 entries 5896 decicycles in av_map_add, 512 runs, 0 skips 2765 decicycles in av_map_get, 512 runs, 0 skips 11396 decicycles in av_dict_set, 511 runs, 1 skips 2029 decicycles in av_dict_get, 512 runs, 0 skips [...] -- Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB The worst form of inequality is to try to make unequal things equal. -- Aristotle [-- Attachment #1.2: signature.asc --] [-- Type: application/pgp-signature, Size: 195 bytes --] [-- Attachment #2: Type: text/plain, Size: 251 bytes --] _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe". ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [FFmpeg-devel] AVDictionary vs. AVSet (AVDictionary2 approximation) 2025-04-15 19:11 ` Michael Niedermayer @ 2025-04-15 20:36 ` Michael Niedermayer 0 siblings, 0 replies; 5+ messages in thread From: Michael Niedermayer @ 2025-04-15 20:36 UTC (permalink / raw) To: FFmpeg development discussions and patches [-- Attachment #1.1: Type: text/plain, Size: 8314 bytes --] On Tue, Apr 15, 2025 at 09:11:33PM +0200, Michael Niedermayer wrote: > On Mon, Apr 14, 2025 at 01:02:00PM +0000, softworkz . wrote: > > > > > > > -----Original Message----- > > > From: ffmpeg-devel <ffmpeg-devel-bounces@ffmpeg.org> On Behalf Of > > > softworkz . > > > Sent: Montag, 14. April 2025 14:40 > > > To: FFmpeg development discussions and patches <ffmpeg- > > > devel@ffmpeg.org> > > > Subject: Re: [FFmpeg-devel] AVDictionary vs. AVSet (AVDictionary2 > > > approximation) > > > > > > > > > > > > > -----Original Message----- > > > > From: ffmpeg-devel <ffmpeg-devel-bounces@ffmpeg.org> On Behalf Of > > > > Michael Niedermayer > > > > Sent: Montag, 14. April 2025 13:33 > > > > To: FFmpeg development discussions and patches <ffmpeg- > > > > devel@ffmpeg.org> > > > > Subject: [FFmpeg-devel] AVDictionary vs. AVSet (AVDictionary2 > > > > approximation) > > > > > > > > Hi > > > > > > > > I just posted a AVSet implementation i wrote in the last 2 days (yes > > > > thats > > > > why i did dissapear for the last 2 days) > > > > > > > > My plan was to use that AVSet as basis for AVDictionary2 in case > > > > benchmarks indicate that its worth it, so is it ? > > > > > > > > with 3 entries (100000 runs) > > > > AVDictionary 0.040sec > > > > AVSet 0.027sec > > > > > > > > with 5 entries (100000 runs) > > > > AVDictionary 0.065sec > > > > AVSet 0.042sec > > > > > > > > with 10 entries (100000 runs) > > > > AVDictionary 0.193sec > > > > AVSet 0.087sec > > > > > > > > with 100 entries (100000 runs) > > > > AVDictionary 8.7 sec > > > > AVSet 1.4 sec > > > > > > > > with 1000 entries (1000 runs) > > > > AVDictionary 8.0 sec > > > > AVSet 0.240 sec > > > > > > > > with 10000 entries (10 runs) > > > > AVDictionary 7.2 sec > > > > AVSet 0.042 sec > > > > > > > > > > > > I was a bit surprised for the 3 and 5 entry case, maybe my benchmark > > > > is buggy or > > > > AVSet is, but then AVDictionary is pretty bad with memory > > > allocations > > > > > > > > AVDictionary needs to strdup every key and value, needs to allocate > > > > the AVDictionary itself and reallocs the entry array each time > > > > thats 10 memory allocation related calls for adding 3 entries > > > > > > > > while AVSet allocates the AVSet and then uses av_fast_realloc() for > > > > the array > > > > and theres nothing else, the key/value goes in that array too > > > > > > > > > > > > bechmark code used is below: > > > > > > > > > > > > #if 0 > > > > for (int runs = 0; runs < 100000; runs++) { > > > > AVSet *set = av_set_new(strcmp, NULL, NULL); > > > > for(int pass = 0; pass < 2; pass++) { > > > > unsigned r = 5; > > > > for(int i=0; i<100; i++) { > > > > r = r*123 + 7; > > > > char str[2*7] = "TESTXXTESTXX"; > > > > str[4] = r; > > > > str[5] = r>>8; > > > > if(pass == 0) { > > > > av_set_add(set, str, 2*7, 0); > > > > } else { > > > > av_set_get(set, NULL, str, NULL); > > > > } > > > > } > > > > } > > > > av_set_free(&set); > > > > } > > > > #else > > > > for (int runs = 0; runs < 100000; runs++) { > > > > AVDictionary *dict = NULL; > > > > for(int pass = 0; pass < 2; pass++) { > > > > unsigned r = 5; > > > > for(int i=0; i<100; i++) { > > > > r = r*123 + 7; > > > > char str[7] = "TEST"; > > > > str[4] = r; > > > > str[5] = r>>8; > > > > if(pass == 0) { > > > > av_dict_set(&dict, str, str, 0); > > > > } else { > > > > av_dict_get(dict, str, NULL, 0); > > > > } > > > > } > > > > } > > > > av_dict_free(&dict); > > > > } > > > > #endif > > > > > > > > > > > > -- > > > > > > Hi Michael, > > > > > > > > > what's not quite realistic is that all keys are starting with the same > > > 4 characters. This affects the lookups of course - and probably > > > (maybe) not equally for both sides. > > > > > > Doesn't the code create duplicate keys (at least when it gets > 65536 > > > it will for sure) ? > > > > > > So, I think, the keys should be completely random (all chars). > > > > > > I would also check whether the lookups are successful (just to be > > > sure). > > > > Sorry, I forgot the most important one: > > > > Timing for population and lookup should be measured separately.. > > Sure, for the v2 (AVMap) i just posted > > with TESTXX / TESTXX strings where XX is random > > 1000 entries > 5354505 decicycles in av_map_add, 512 runs, 0 skips > 4040575 decicycles in av_map_get, 512 runs, 0 skips > 148082828 decicycles in av_dict_set, 512 runs, 0 skips > 145828939 decicycles in av_dict_get, 512 runs, 0 skips > > 100 entries > 332015 decicycles in av_map_add, 512 runs, 0 skips > 193726 decicycles in av_map_get, 512 runs, 0 skips > 1697242 decicycles in av_dict_set, 512 runs, 0 skips > 1392837 decicycles in av_dict_get, 512 runs, 0 skips > > 10 entries > 21142 decicycles in av_map_add, 512 runs, 0 skips > 11395 decicycles in av_map_get, 512 runs, 0 skips > 45663 decicycles in av_dict_set, 512 runs, 0 skips > 19756 decicycles in av_dict_get, 512 runs, 0 skips > > 5 entries > 9210 decicycles in av_map_add, 512 runs, 0 skips > 4870 decicycles in av_map_get, 511 runs, 1 skips > 18823 decicycles in av_dict_set, 512 runs, 0 skips > 5483 decicycles in av_dict_get, 512 runs, 0 skips > > 3 entries > 5693 decicycles in av_map_add, 512 runs, 0 skips > 2645 decicycles in av_map_get, 512 runs, 0 skips > 11462 decicycles in av_dict_set, 511 runs, 1 skips > 2532 decicycles in av_dict_get, 512 runs, 0 skips > > > > with XXST / XXST strings where XX is random > > 1000 entries > 5321153 decicycles in av_map_add, 512 runs, 0 skips > 4295153 decicycles in av_map_get, 512 runs, 0 skips > 70417784 decicycles in av_dict_set, 512 runs, 0 skips > 68188612 decicycles in av_dict_get, 512 runs, 0 skips > > 100 entries > 322872 decicycles in av_map_add, 512 runs, 0 skips > 216032 decicycles in av_map_get, 511 runs, 1 skips > 1022088 decicycles in av_dict_set, 512 runs, 0 skips > 723612 decicycles in av_dict_get, 512 runs, 0 skips > > 10 entries > 20993 decicycles in av_map_add, 512 runs, 0 skips > 11744 decicycles in av_map_get, 512 runs, 0 skips > 38945 decicycles in av_dict_set, 512 runs, 0 skips > 11308 decicycles in av_dict_get, 512 runs, 0 skips > > 5 entries > 10007 decicycles in av_map_add, 511 runs, 1 skips > 5004 decicycles in av_map_get, 512 runs, 0 skips > 17374 decicycles in av_dict_set, 511 runs, 1 skips > 3848 decicycles in av_dict_get, 512 runs, 0 skips > > 3 entries > 5896 decicycles in av_map_add, 512 runs, 0 skips > 2765 decicycles in av_map_get, 512 runs, 0 skips > 11396 decicycles in av_dict_set, 511 runs, 1 skips > 2029 decicycles in av_dict_get, 512 runs, 0 skips This contained a bug, Dictionary used C code written by FFmpeg developers and did a case insensitive compare while AVMap used strcmp() which is case sensitive and not written by FFmpeg developers. I will post new test results with av_strcasecmp() instead and also put it in a new thread so it can be found easier thx [...] -- Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB Into a blind darkness they enter who follow after the Ignorance, they as if into a greater darkness enter who devote themselves to the Knowledge alone. -- Isha Upanishad [-- Attachment #1.2: signature.asc --] [-- Type: application/pgp-signature, Size: 195 bytes --] [-- Attachment #2: Type: text/plain, Size: 251 bytes --] _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe". ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2025-04-15 20:36 UTC | newest] Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2025-04-14 11:33 [FFmpeg-devel] AVDictionary vs. AVSet (AVDictionary2 approximation) Michael Niedermayer 2025-04-14 12:40 ` softworkz . 2025-04-14 13:02 ` softworkz . 2025-04-15 19:11 ` Michael Niedermayer 2025-04-15 20:36 ` Michael Niedermayer
Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel This inbox may be cloned and mirrored by anyone: git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git # If you have public-inbox 1.1+ installed, you may # initialize and index your mirror using the following commands: public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \ ffmpegdev@gitmailbox.com public-inbox-index ffmpegdev Example config snippet for mirrors. AGPL code for this site: git clone https://public-inbox.org/public-inbox.git