mutation naming conventions
Alex Shinn
(24 May 2023 02:08 UTC)
|
Re: mutation naming conventions
Marc Nieper-Wißkirchen
(24 May 2023 05:59 UTC)
|
Re: mutation naming conventions
Alex Shinn
(24 May 2023 08:28 UTC)
|
Re: mutation naming conventions
Marc Nieper-Wißkirchen
(24 May 2023 08:53 UTC)
|
Re: mutation naming conventions
Alex Shinn
(24 May 2023 10:10 UTC)
|
Re: mutation naming conventions
Marc Nieper-Wißkirchen
(25 May 2023 16:30 UTC)
|
Re: mutation naming conventions
Shawn Wagner
(31 May 2023 01:09 UTC)
|
Re: mutation naming conventions
Wolfgang Corcoran-Mathe
(25 May 2023 17:35 UTC)
|
Re: mutation naming conventions Bradley Lucier (26 May 2023 17:56 UTC)
|
Re: mutation naming conventions
Alex Shinn
(27 May 2023 08:31 UTC)
|
Re: mutation naming conventions
John Cowan
(28 May 2023 22:47 UTC)
|
Re: mutation naming conventions
Alex Shinn
(29 May 2023 00:45 UTC)
|
Re: mutation naming conventions
John Cowan
(29 May 2023 01:26 UTC)
|
Re: mutation naming conventions
Alex Shinn
(29 May 2023 09:35 UTC)
|
Re: mutation naming conventions
Vladimir Nikishkin
(29 May 2023 15:06 UTC)
|
Re: mutation naming conventions
Marc Nieper-Wißkirchen
(30 May 2023 14:52 UTC)
|
On May 25, 2023, at 1:34 PM, Wolfgang Corcoran-Mathe <xxxxxx@sigwinch.xyz> wrote: > > This point deserves more discussion. Do we have to incur "impractical > overhead" to avoid mutation leaks? Without addressing “impractical overhead" in general, I’d like to mention some timings and space usage in the sample 64-bit Gambit implementation of SRFI 231 on a MacBook Pro with M1 Max processor and 64GB of RAM. We define two 5,000 x 5,000 arrays, the first an f64 specialized array, the second a generalized array with the same getter as the first: (define domain (make-interval '#(5000 5000))) (define specialized (time (array-copy (make-array domain (lambda (i j) (fl- (fl* (random-real) 275.) 10.))) f64-storage-class))) (define generalized (make-array domain (array-getter specialized))) There is no time (or space) difference between simple array-copy and array-copy! of the specialized array into another f64 array, which both use memcpy: (time (array-copy! specialized)) 0.033412 secs real time 0.033172 secs cpu time (0.015888 user, 0.017284 system) no collections 200000640 bytes allocated 12209 minor faults no major faults (time (array-copy specialized)) 0.031428 secs real time 0.031265 secs cpu time (0.014084 user, 0.017181 system) no collections 200000640 bytes allocated 12209 minor faults no major faults Copying the generalized version of the array into an f64 array takes *much* longer, but the specific time penalty for using array-copy instead of array-copy! is about 60%; the space penalty is 120%: (time (array-copy! generalized f64-storage-class)) 0.520990 secs real time 0.520128 secs cpu time (0.478557 user, 0.041571 system) no collections 1000000576 bytes allocated 37494 minor faults no major faults (time (array-copy generalized f64-storage-class)) 0.839642 secs real time 0.837973 secs cpu time (0.749068 user, 0.088905 system) 2 collections accounting for 0.469323 secs real time (0.423792 user, 0.044610 system) 2199999200 bytes allocated 33701 minor faults no major faults There’s no time (or space) difference when copying the specialized f64 array to an f16 array, with a somewhat complex conversion routine: (time (array-copy! specialized f16-storage-class)) 0.762574 secs real time 0.761298 secs cpu time (0.724044 user, 0.037254 system) no collections 850000704 bytes allocated 28338 minor faults no major faults (time (array-copy specialized f16-storage-class)) 0.854443 secs real time 0.852973 secs cpu time (0.726463 user, 0.126510 system) 1 collection accounting for 0.095403 secs real time (0.001659 user, 0.093639 system) 849999040 bytes allocated 24279 minor faults no major faults (There’s an extra accidental GC there for array-copy.) With the generalized array, there’s about a 20% time penalty and 140% space penalty when using array-copy instead of array-copy! into an f16 array: (time (array-copy! generalized f16-storage-class)) 0.922248 secs real time 0.920584 secs cpu time (0.913335 user, 0.007249 system) 1 collection accounting for 0.000139 secs real time (0.000135 user, 0.000009 system) 850000192 bytes allocated 3052 minor faults no major faults (time (array-copy generalized f16-storage-class)) 1.184263 secs real time 1.181636 secs cpu time (1.101517 user, 0.080119 system) 2 collections accounting for 0.414932 secs real time (0.376693 user, 0.037288 system) 2050000480 bytes allocated 52451 minor faults no major faults When converting the specialized f64 array to a u8 array, there is about an 80% time penalty and 10% space penalty when using array-copy instead of array-copy!: (time (array-copy! (array-map (lambda (x) (fxmax 0 (fxmin 255 (exact (flround x))))) specialized) u8-storage-class)) 2.209744 secs real time 2.204997 secs cpu time (2.033162 user, 0.171835 system) 11 collections accounting for 0.088302 secs real time (0.007955 user, 0.080307 system) 11503939536 bytes allocated 79017 minor faults no major faults (time (array-copy (array-map (lambda (x) (fxmax 0 (fxmin 255 (exact (flround x))))) specialized) u8-storage-class)) 3.977813 secs real time 3.968935 secs cpu time (3.842786 user, 0.126149 system) 10 collections accounting for 1.832764 secs real time (1.810734 user, 0.017901 system) 12703940128 bytes allocated 80540 minor faults no major faults Finally, when converting the u8 specialized array to an f32 array, the time penalty when using array-copy instead of array-copy! is about 23%; the space penalty is about 133%: (time (array-copy! (array-map inexact u8array) f32-storage-class)) 0.654019 secs real time 0.652803 secs cpu time (0.621477 user, 0.031326 system) no collections 900000944 bytes allocated 19144 minor faults no major faults (time (array-copy (array-map inexact u8array) f32-storage-class)) 0.802877 secs real time 0.801162 secs cpu time (0.710570 user, 0.090592 system) 2 collections accounting for 0.305247 secs real time (0.242820 user, 0.061808 system) 2100000400 bytes allocated 21621 minor faults no major faults The program is included below. Brad