...would immediately *negatively affect* workhorses...

On Tuesday, April 18, 2023 at 8:26:27 PM UTC+2 TheDiveO wrote:

> The standard libraries in several parts define and also use structs where 
> the field ordering and padding is crucial as they are shared with operating 
> system functions. Trying to rearrange fields in 3rd party apllications 
> would immediately workhorses like Docker container engine, with associated 
> as well as independent modules for low-level networking configuration and 
> communication, communication with netfilter system functions on freebsd, 
> linux, and many more things.
>
> To rephrase a well-meant warning from a manager: there are better ways to 
> become prominent.
>
> On Tuesday, April 18, 2023 at 7:54:17 PM UTC+2 Def Ceb wrote:
>
>> Hello.
>> This is a request for comments on an idea I had.
>>
>> While working on a personal project, I noticed that quite a few structs 
>> in the standard library, exported or otherwise, could have their memory 
>> footprint reduced by simply reordering their members so that padding 
>> required for alignment is reduced or even eliminated.
>> This can be in exported and unexported structs, and in both exported and 
>> unexported fields.
>> Examples as of Go 1.20.3, on an amd64 host:
>>
>>    - moving the member h of the unexported struct crypto/sha1.digest to 
>>    the end would remove 4 bytes of padding between x and nx
>>    
>>
>>    - moving the unexported minInputLen field of the regexp.Regexp struct 
>>    to right after matchcap will remove 6 bytes of padding
>>    - The Typeflag member of archive/tar.Header could be moved to the end 
>>    of the struct, removing 7 bytes of padding
>>    
>> Instances similar to the first two examples should be fairly 
>> frictionless, only affecting code that makes unsafe assumptions about 
>> standard library internals.
>> Examples of the third would, at the very least, break unkeyed struct 
>> literals, either at compile-time or silently at run-time, depending on the 
>> types in use and whether the instantiation uses a compatible literal.
>> While implementing the third example does not seem to go against the Go 1 
>> compatibility promise, it would seem like a fairly unpopular change if it 
>> caused large swathes of code utilizing unkeyed struct literals to stop 
>> compiling or, worse, break silently, and unless using them is prohibited at 
>> some point (at least for non-locally-defined structs), it'll probably be 
>> avoided. As far as I can tell, the status is similar for Go assembly.
>>
>> As a benefit, this would lead to some small reductions in memory usage 
>> per instance of many structs, potentially leading to reduced need to grow 
>> the stack of threads. Though there are arguments that could be made against 
>> this as well, such as that some structs may contain multiple "groups" of 
>> data (which are not split up into multiple structs, for whatever reason) 
>> which shouldn't be split up, or that it could cause too much churn for too 
>> little benefit (I have not implemented nor benchmarked this at the moment), 
>> or that this is good, but it should be handled in the compiler instead.
>>
>> I already made something to automatically generate a list of structs in 
>> the standard library which have padding, based on my project.
>>
>>    1. Would a pull request with struct reordering to reduce padding be 
>>    welcomed?
>>    2. Is there any chance of a policy of "try to avoid padding, if 
>>    practical" being put in place for future additions to the standard 
>> library?
>>    3. What about the gc compiler reordering struct member ordering at 
>>    compile-time for the same effect, and in third-party code as well?
>>    
>>

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/bd28cd16-aa9d-4aa9-b93b-64acfa965ed3n%40googlegroups.com.

Reply via email to