I wonder what is the memory footprint of a variable from type IORef a if I know that the size of a is x. Also what is the expected performance of the function writeIORef applied to integer compare to say a regular variable assignment (like x = 3) in, say, Java ?
1
There are 1 answers
Related Questions in HASKELL
- Typeclass projections as inheritance
- How to generate all possible matrices given a number n in Haskell
- Is there a way to get `cabal` to detect changes to non-Haskell source files?
- How to have fixed options using Option.Applicative in haskell?
- How can I create a thread in Haskell that will restart if it gets killed due to any reason?
- Automatic Jacobian matrix in Haskell
- Haskell writing to named pipe unexpectedly fails with `openFile: does not exist (No such device or address)`
- Why does Enum require to implement toEnum and fromEnum, if that's not enough for types larger than Int?
- Non-exhaustive patterns in function compress
- How to get terms names of GADT in Template Haskell?
- Implementing eval() function with Happy parser generator
- How to count the occurences of every element in a list in Haskell fast?
- In Haskell, what does `Con Int` mean?
- Extract a Maybe from a heterogeneous collection
- Haskell, Stack, importing module shows error "Module not found"
Related Questions in IOREF
- How can atomicModifyIORef cause leaks? And why does atomicModifyIORef' solve the problem?
- Haskell IORef usage in concurrent setting
- Behaviour of IORef in Haskell
- How come `readIORef` is a blocking operation
- Memory footprint and performance of IORef
- How does readIORef work: creates copy or it does not?
- Haskell IORef - an answer vs. a function to get an answer
- IORef in Haskell
- How do I rewrite a Haskell function that uses modifyIORef' to use atomicModifyIORef'
- Zoom instance for ReaderT IORef
- How to share IORef state between two function invocations in Haskell when using IO?
- IORef still refers to the old value after update
- What is the purpose of the extra result parameter of atomicModifyIORef?
- Compilation of IORef and STRef
- IORef handling of list
Popular Questions
- How do I undo the most recent local commits in Git?
- How can I remove a specific item from an array in JavaScript?
- How do I delete a Git branch locally and remotely?
- Find all files containing a specific text (string) on Linux?
- How do I revert a Git repository to a previous commit?
- How do I create an HTML button that acts like a link?
- How do I check out a remote Git branch?
- How do I force "git pull" to overwrite local files?
- How do I list all files of a directory?
- How to check whether a string contains a substring in JavaScript?
- How do I redirect to another webpage?
- How can I iterate over rows in a Pandas DataFrame?
- How do I convert a String to an int in Java?
- Does Python have a string 'contains' substring method?
- How do I check if a string contains a specific word?
Popular Tags
Trending Questions
- UIImageView Frame Doesn't Reflect Constraints
- Is it possible to use adb commands to click on a view by finding its ID?
- How to create a new web character symbol recognizable by html/javascript?
- Why isn't my CSS3 animation smooth in Google Chrome (but very smooth on other browsers)?
- Heap Gives Page Fault
- Connect ffmpeg to Visual Studio 2008
- Both Object- and ValueAnimator jumps when Duration is set above API LvL 24
- How to avoid default initialization of objects in std::vector?
- second argument of the command line arguments in a format other than char** argv or char* argv[]
- How to improve efficiency of algorithm which generates next lexicographic permutation?
- Navigating to the another actvity app getting crash in android
- How to read the particular message format in android and store in sqlite database?
- Resetting inventory status after order is cancelled
- Efficiently compute powers of X in SSE/AVX
- Insert into an external database using ajax and php : POST 500 (Internal Server Error)
In Haskell, an
IORef abehaves like a single-element mutable array. The definition ofIORefis the following, disregarding newtype wrapping:Here,
MutVar# RealWorld ais a primitive mutable reference type. It is a pointer which points to two words, a header, and a payload which is itself a pointer to a normal lifted Haskell object. Hence the overhead ofMutVaris two words (16 byte on 64 bit systems) and one indirection.The overhead of
MutVar#is thus one extra indirection and one extra header word. This is unavoidable. In contrast, the overhead of theIORefconstructor is also one header word and one indirection, but it can be eliminated by unpackingIORef:Here, the bang on
IORefcauses the underlyingMutVarto be unpacked intoFoo. But while this unpacking works whenever we define new data types, it does not work if we use any existing parameterized type, like lists. In[IORef a], we pay the full cost with two extra indirections.IORefwill be also generally unpacked by GHC optimization if it is used as an argument to a function:IORef a -> bwill be generally unboxed toMutVar# RealWorld a -> b, if you compile with optimization.However, all of the above overheads are less important than the overhead in garbage collection when you use a large number of
IORef-s. To avoid that, it is advisable to use a single mutable array instead of manyIORef-s.