<turbo-stream action="append" target="posts_list"><template>    <div class="postbit" id="356383" data-post-id="356383">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="garrison" src="/assets/icons/user-9f439610.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  garrison
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>You are essentially traveling down the chain of thought that led to Streams. I’d strongly recommend trying the LiveComponent strategy first, and then look into Streams in the future if you feel the need (you probably won’t).</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="356383" data-batch-url="/posts/batch_likers">
                        1
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/liveview-performance-problems-morphdom-taking-up-to-1500ms-to-patch-updates/69408/12">Post #11</a>
	                </div>
	            </div>
              <div id="likers-container-356383" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="356383"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #11"></div>
  </section>
</div>
    <div class="postbit" id="356384" data-post-id="356384">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="sodapopcan" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/sodapopcan/120/34668_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  sodapopcan
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<aside class="quote no-group" data-username="garrison" data-post="11" data-topic="69408">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/letter_avatar_proxy/v4/letter/g/3bc359/48.png" class="avatar"> garrison:</div>
<blockquote>
<p>Well first you may have noticed that I’m essentially borrowing that line from the docs <img src="https://forum.elixirforum.com/images/emoji/apple/slight_smile.png?v=15" title=":slight_smile:" class="emoji" alt=":slight_smile:" loading="lazy" width="20" height="20"></p>
</blockquote>
</aside>
<p>Ha yes, I figured you just may know a little more.  I sorta remember someone asking the different between a function component and a LiveComponent from a memory standpoint and José saying there is essentially no difference but I can’t find the thread so I very well have misread that.  The other stuff I understand, obviously much less overhead than a nested LiveView and I do understand persistent data structures so ya you’re right, that is still <em>some</em> overhead for the “pointer” (I know it’s slightly more complex than that).  Though now that I think about it, I did remember a comment (that I also can’t find) where someone was saying that smaller maps are actually fully copied but no idea if that’s true, so basically I’m just piling up all these things I read that challenge what I already thought and decided you were the unlucky one I would ask to clarify <img src="https://forum.elixirforum.com/images/emoji/apple/sweat_smile.png?v=15" title=":sweat_smile:" class="emoji" alt=":sweat_smile:" loading="lazy" width="20" height="20"></p>
<p>The solution to my problem is that I should just read The BEAM Book.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="356384" data-batch-url="/posts/batch_likers">
                        0
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/liveview-performance-problems-morphdom-taking-up-to-1500ms-to-patch-updates/69408/13">Post #12</a>
	                </div>
	            </div>
              <div id="likers-container-356384" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="356384"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #12"></div>
  </section>
</div>
    <div class="postbit" id="356387" data-post-id="356387">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="garrison" src="/assets/icons/user-9f439610.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  garrison
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<aside class="quote no-group" data-username="sodapopcan" data-post="13" data-topic="69408">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/sodapopcan/48/34668_2.png" class="avatar"> sodapopcan:</div>
<blockquote>
<p>I sorta remember someone asking the different between a function component and a LiveComponent from a memory standpoint and José saying there is essentially no difference</p>
</blockquote>
</aside>
<p>I think the simplest way to explain the difference is that LiveComponents maintain diffs of their assigns separately, while function components do not. In other words, function components (I believe) lack the <code>:__changed__</code> assign which stores the diffs.</p>
<p>Obviously the overhead of this is to store things which are already in-memory, so it’s just the overhead of another map (and we’re back to square one here).</p>
<p>They are also treated differently by the diffing algorithm and on the wire. I don’t know <em>exactly</em> how it works but the impression I got skimming the code is that they’re treated on the client as if they are a root LiveView, so the morphdom invocation for each LiveComponent is separate from the main tree. Or something, not sure.</p>
<p>The fact that they are diffed separately is very important though, because it means the diff can just be <code>%{id =&gt; diff}</code> on the wire, without having to worry about <em>where in the DOM that <code>id</code> actually is</em>, because it’s “globally” unique (per page). So there’s a speedup from that too.</p>
<p>I’m sure a maintainer could give you a much more thorough explanation.</p>
<aside class="quote no-group" data-username="sodapopcan" data-post="13" data-topic="69408">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/sodapopcan/48/34668_2.png" class="avatar"> sodapopcan:</div>
<blockquote>
<p>someone was saying that smaller maps are actually fully copied</p>
</blockquote>
</aside>
<p>I wouldn’t be surprised, there’s always some overhead with keeping references and a point where the tradeoff isn’t worth it. Only maps above (I believe) 32 entries are stored as hash tables (really hash array-mapped tries, a mouthful).</p>
<p>Important to keep in mind, though, that just because the map is copied doesn’t mean its contents are! If you had a large map in a small map and duplicated the small map, the large map would still just be a reference (I assume).</p>
<p>Of course this is made even more confusing by reference-counted binaries, which aren’t copied even <em>across processes</em>…</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="356387" data-batch-url="/posts/batch_likers">
                        2
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/liveview-performance-problems-morphdom-taking-up-to-1500ms-to-patch-updates/69408/14">Post #13</a>
	                </div>
	            </div>
              <div id="likers-container-356387" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="356387"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #13"></div>
  </section>
</div>
    <div class="postbit" id="356392" data-post-id="356392">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="tmbb" src="/assets/icons/user-9f439610.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  tmbb
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>I did replace some of the HTML by live components and performance is now much better (patch times ~80-220ms instead of 1500ms), but the delay attributable to the DOM patches (according to the timings given by <code>liveSocket.enableProfiling();</code>) is still noticeable. I’m stil a bit incredulous on why my multi-GHz PC takes so long to patch the DOM. I know I’m not being very smart in the change tracking, but still, it’s disappointing.</p>
<p>I’m seriously thinking of using a normal JS framework instead of LiveView. The only reason I haven’t done it yet is the fact that it would make it harder to use ecto changesets for validation (I’d have to convert the ecto chnagesets to JS somehow, and I’m not in the mood for that).</p>
<p>In any case, I think this problem needs a bit more publicity. I might contribute to the docs warning users of the Morphdom troubles. There are only about 3-4 places on the internet that discuss LiveView’s client-side problems (a youtube video and a couple posts on this forum). Everywhere else sells LiveView as something which will not cause problems for real-world pages, and the main discussion is always centered on the performance impact on the elixir side (“be careful about having too many PubSub messages”, or “be careful about not storing too much state on the server”). But reading the docs I’d never dream about having problems with a webpage with a couple thousands of HTML elements. Worse, it took me 2 days to think of DOM patching as the cause of the performance issues. This speaks more to my ignorance about frontend stuff, but I think the docs should include a warning somewhere.</p>
<p>Giving the situation a more sober look, it seems like even in the worst case (1500ms for 10,000 elements) Morphdom is taking 0.1ms per HTML element. Is that a low? IDK, JS is an interpreted language and the DOM is a big, complex object. So, maybe, shame on me for being surprised…</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="356392" data-batch-url="/posts/batch_likers">
                        0
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/liveview-performance-problems-morphdom-taking-up-to-1500ms-to-patch-updates/69408/15">Post #14</a>
	                </div>
	            </div>
              <div id="likers-container-356392" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="356392"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #14"></div>
  </section>
</div>
    <div class="postbit" id="356395" data-post-id="356395">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="derek-zhou" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/derek-zhou/120/19943_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  derek-zhou
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<aside class="quote no-group" data-username="tmbb" data-post="15" data-topic="69408">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/letter_avatar_proxy/v4/letter/t/77aa72/48.png" class="avatar"> tmbb:</div>
<blockquote>
<p>I’m seriously thinking of using a normal JS framework instead of LiveView.</p>
</blockquote>
</aside>
<aside class="quote no-group" data-username="tmbb" data-post="15" data-topic="69408">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/letter_avatar_proxy/v4/letter/t/77aa72/48.png" class="avatar"> tmbb:</div>
<blockquote>
<p>IDK, JS is an interpreted language and the DOM is a big, complex object.</p>
</blockquote>
</aside>
<p>I feel your pain. However, I am not sure switching to a JS framework will help. Like you said, the bottleneck in in MorphDOM. i’d assume letting the JS part to work more would only make it slower.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="356395" data-batch-url="/posts/batch_likers">
                        0
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/liveview-performance-problems-morphdom-taking-up-to-1500ms-to-patch-updates/69408/16">Post #15</a>
	                </div>
	            </div>
              <div id="likers-container-356395" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="356395"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #15"></div>
  </section>
</div>
    <div class="postbit" id="356396" data-post-id="356396">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="garrison" src="/assets/icons/user-9f439610.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  garrison
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<aside class="quote no-group" data-username="tmbb" data-post="15" data-topic="69408">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/letter_avatar_proxy/v4/letter/t/77aa72/48.png" class="avatar"> tmbb:</div>
<blockquote>
<p>I did replace some of the HTML by live components and performance is now much better (patch times ~80-220ms instead of 1500ms)</p>
</blockquote>
</aside>
<p>That is still <em>very</em> slow. Could you take a look at the socket in devtools and tell us how large the diffs coming over the wire are? I would guess it’s in the MB?</p>
<p>You need to shrink the diffs further. Which parts of the table did you convert to LiveComponents? If it was just the rows and they’re still very large, try wrapping the columns too.</p>
<aside class="quote no-group" data-username="tmbb" data-post="15" data-topic="69408">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/letter_avatar_proxy/v4/letter/t/77aa72/48.png" class="avatar"> tmbb:</div>
<blockquote>
<p>I’m seriously thinking of using a normal JS framework instead of LiveView.</p>
</blockquote>
</aside>
<p>I’m not here to tell you what to do (I am a bigger proponent of client-side rendering than you might expect), but before you head down that path you may want to try searching for the keywords “react table slow”.</p>
<p>Diffing algorithms are not magic, they don’t handle huge amounts of data well.</p>
<p>If the table is large enough you will need to virtualize it (you would have to do this with React too).</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="356396" data-batch-url="/posts/batch_likers">
                        0
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/liveview-performance-problems-morphdom-taking-up-to-1500ms-to-patch-updates/69408/17">Post #16</a>
	                </div>
	            </div>
              <div id="likers-container-356396" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="356396"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #16"></div>
  </section>
</div>
    <div class="postbit" id="356397" data-post-id="356397">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="tmbb" src="/assets/icons/user-9f439610.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  tmbb
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<aside class="quote no-group" data-username="garrison" data-post="17" data-topic="69408">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/letter_avatar_proxy/v4/letter/g/3bc359/48.png" class="avatar"> garrison:</div>
<blockquote>
<p>That is still <em>very</em> slow. Could you take a look at the socket in devtools and tell us how large the diffs coming over the wire are? I would guess it’s in the MB?</p>
</blockquote>
</aside>
<p>They’re rather big, yeah: from 33kB (if I only change the text inside an input component) to 123kB (when I reorder stuff in the list).</p>
<aside class="quote no-group" data-username="garrison" data-post="17" data-topic="69408">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/letter_avatar_proxy/v4/letter/g/3bc359/48.png" class="avatar"> garrison:</div>
<blockquote>
<p>I’m not here to tell you what to do (I am a bigger proponent of client-side rendering than you might expect), but before you head down that path you may want to try searching for the keywords “react table slow”.</p>
</blockquote>
</aside>
<p>I’m aware that diffing algorithms are not magic, but my hope is that in JS I can have more control over the events I emmit and which parts of the tree I actually need to re-render. But again, I have to think a lot about this.</p>
<p>I can make some trivial UI changes in order to decrease the depth of the components (instead of a LiveView per project I can have a LiveView per table, which is the fundamental unit the user will be working in) and I believe most tables will have &lt; 20-30 columns. I start getting bad times when I reach the 60-80 columns. But I’m always nervous about having these limits (if I expect a size of 20, I’d rather have the UI allow for 200 as a safety margin).</p>
<p>But thanks for your input anyway!</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="356397" data-batch-url="/posts/batch_likers">
                        0
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/liveview-performance-problems-morphdom-taking-up-to-1500ms-to-patch-updates/69408/18">Post #17</a>
	                </div>
	            </div>
              <div id="likers-container-356397" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="356397"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #17"></div>
  </section>
</div>
    <div class="postbit" id="356399" data-post-id="356399">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="garrison" src="/assets/icons/user-9f439610.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  garrison
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<aside class="quote no-group" data-username="tmbb" data-post="18" data-topic="69408">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/letter_avatar_proxy/v4/letter/t/77aa72/48.png" class="avatar"> tmbb:</div>
<blockquote>
<p>I’m aware that diffing algorithms are not magic, but my hope is that in JS I can have more control over the events I emmit and which parts of the tree I actually need to re-render.</p>
</blockquote>
</aside>
<p>In LiveView the way you control this is with LiveComponents. If only one component changes, then only that component will be re-rendered.</p>
<aside class="quote no-group" data-username="tmbb" data-post="18" data-topic="69408">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/letter_avatar_proxy/v4/letter/t/77aa72/48.png" class="avatar"> tmbb:</div>
<blockquote>
<p>I start getting bad times when I reach the 60-80 columns.</p>
</blockquote>
</aside>
<p>Like I said, if you’re doing this: <code>&lt;div :for={col &lt;- @cols}&gt;{col.text}&lt;/div&gt;</code>, and you have 60 columns, <em>all 60 columns will be sent when one changes</em>. If your columns have a lot of dynamic content then this could be expensive. I will say though that 100ms to diff 60 columns <em>still</em> doesn’t sound right to me, so there might be something else wrong. You should inspect the diffs more carefully and see if something else is leaking through that you’ve overlooked.</p>
<aside class="quote no-group" data-username="tmbb" data-post="18" data-topic="69408">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/letter_avatar_proxy/v4/letter/t/77aa72/48.png" class="avatar"> tmbb:</div>
<blockquote>
<p>to 123kB (when I reorder stuff in the list).</p>
</blockquote>
</aside>
<p>This is a sign that something is wrong, because re-ordering LiveComponents should be effectively free (on the order of maybe a couple hundred bytes).</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="356399" data-batch-url="/posts/batch_likers">
                        0
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/liveview-performance-problems-morphdom-taking-up-to-1500ms-to-patch-updates/69408/19">Post #18</a>
	                </div>
	            </div>
              <div id="likers-container-356399" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="356399"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #18"></div>
  </section>
</div>
    <div class="postbit" id="356412" data-post-id="356412">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="sodapopcan" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/sodapopcan/120/34668_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  sodapopcan
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Thanks for the response, this is digging much more into stuff I don’t know.  I don’t want to address too much as it’s a bit of the main thread, but yes, this all makes sense for the most part.  Wasn’t even considering <code>:__changed__</code> <img src="https://forum.elixirforum.com/images/emoji/apple/person_facepalming.png?v=15" title=":person_facepalming:" class="emoji" alt=":person_facepalming:" loading="lazy" width="20" height="20"></p>
<aside class="quote no-group" data-username="garrison" data-post="14" data-topic="69408">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/letter_avatar_proxy/v4/letter/g/3bc359/48.png" class="avatar"> garrison:</div>
<blockquote>
<p>Important to keep in mind, though, that just because the map is copied doesn’t mean its contents are!</p>
</blockquote>
</aside>
<p>To my mind, what the comment I read was saying was saying that it was a full copy.  Maybe it wasn’t though?  I need to read up a little bit more in order to respond even semi-intelligently.</p>
<p>Thanks!</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="356412" data-batch-url="/posts/batch_likers">
                        2
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/liveview-performance-problems-morphdom-taking-up-to-1500ms-to-patch-updates/69408/20">Post #19</a>
	                </div>
	            </div>
              <div id="likers-container-356412" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="356412"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #19"></div>
  </section>
</div>
    <div class="postbit" id="356416" data-post-id="356416">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="Zurga" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/Zurga/120/38832_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  Zurga
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Can you point to some code to have a look at? It might make it easier to understand.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="356416" data-batch-url="/posts/batch_likers">
                        1
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/liveview-performance-problems-morphdom-taking-up-to-1500ms-to-patch-updates/69408/21">Post #20</a>
	                </div>
	            </div>
              <div id="likers-container-356416" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="356416"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #20"></div>
  </section>
</div>
</template></turbo-stream><turbo-stream action="replace" target="load-more-container"><template><div id="load-more-container" class="load-more-container">
    <a class="load-more-button" data-turbo-stream="true" href="/topics/69408/load_more?page=3">Load more posts (35 remaining)</a>
</div></template></turbo-stream>