[HN Gopher] Curious lack of sprintf scaling
___________________________________________________________________
Curious lack of sprintf scaling
Author : markdog12
Score : 67 points
Date : 2022-02-25 21:11 UTC (1 hours ago)
(HTM) web link (aras-p.info)
(TXT) w3m dump (aras-p.info)
| EdSchouten wrote:
| I think the only reasonable solution is to completely deprecate
| functions like setlocale(). Software should just use _l()
| functions if they want something localised.
|
| Global state considered harmful.
| mort96 wrote:
| FWIW, the tests show that sprintf_l is no faster than sprintf,
| if you're passing around the same locale object in different
| threads. So it can help, but it's not an automatic win unless
| you make sure that each thread keeps a separate locale object.
| sly010 wrote:
| Or in this case locale state considered harmful ;)
| worik wrote:
| Global mutable state.....
| stingraycharles wrote:
| Well if it wasn't mutable, it wouldn't be state but just a
| global constant variable. Which is much less harmful.
| addaon wrote:
| I wonder if the original export code that lead to this
| investigation was actually correct? It sounds like sprintf() was
| being called without an explicit locale. This can be fine if
| Blender does a top-level setlocale(), but can also be subtly and
| horrible unfine otherwise...
|
| Sounds like there's plenty of opportunity for library-level
| improvements here (as well as application-level workarounds), but
| certainly the sprintf_l(..., locale, ...) being slow is the most
| surprising to me, and likely the easiest to fix.
| markdog12 wrote:
| You mean like this, from the article?
|
| > Given that this is an Apple operating system, we might know
| it has a snprintf_l function which takes an explicit locale,
| and hope that this would make it scale. Just pass NULL which
| means "use C locale":
|
| And then the chart and discussion following it?
| addaon wrote:
| Right. My point is that the change from sprintf() to
| sprintf(..., NULL, ...) is a semantic-modifying change. For
| the purpose of understanding what's going on, that's fine.
| For the purpose of optimizing software, that's scary. And
| even scarier is that it seems somewhat more likely that the
| version under test is more correct than the version as
| shipped.
| markdog12 wrote:
| > Technically, there are no bugs anywhere above - all the
| functions work correctly
|
| They were all correct. But yeah, scary how primitives can
| result in such poor performance. FWIW, they ended up using
| {fmt}: https://developer.blender.org/D13998
| garaetjjte wrote:
| If you want to read rant about setlocale, highly recommended:
| https://github.com/mpv-player/mpv/commit/1e70e82baa9193f6f02...
| MobiusHorizons wrote:
| Excuse the lack of context here, I haven't dealt much with
| locale's in C, and I'm probably showing my ignorance.
|
| Why would you ever mutate a locale object? Is that the common way
| to change locales in C? Wouldn't it make more sense to have
| locale objects be roughly immutable? It doesn't seem like they
| should have any real reason to change very often in a typical
| use-case. I would think any given person only has a small (1-3 or
| so) number of locale's they use on any regular basis.
|
| Are locale objects being mutated really common enough that you
| need a mutex to protect against accidentally rendering something
| in the wrong locale?
| mort96 wrote:
| I would guess that there's just nothing in the standard which
| _prevents_ people from changing the locale. So if you want a
| conforming implementation, you need your implementation to work
| if the programmer changed the locale object directly.
| fyrn- wrote:
| This would really benefit from labeling the y Axis
| formerly_proven wrote:
| ms for formatting 2 million ints
| AdamH12113 wrote:
| Agreed. You should always label your axes. In this case, the Y
| axis is milliseconds on a logarithmic scale.
| formerly_proven wrote:
| C/C++ locales are a trashfire. The path to enlightenment is to
| not use them and discard all libraries which think they can get
| away with calling setlocale (which a few do, but is more or less
| a given when we're talking about GUIs).
|
| > obviously you should not use sprintf, you should use C++
| iostreams
|
| Friends don't let friends use iostreams.
___________________________________________________________________
(page generated 2022-02-25 23:00 UTC)