<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class="">Hi,</div><div class=""><br class=""></div><div class="">I currently writing a demo app to teach myself the fundamentals of Metal and a big part of that is obviously working with matrices. What I’m seeing is that the code build them has some serious compilation time problems.</div><div class=""><br class=""></div><div class="">The worst case is this function, which according to&nbsp;-debug-time-function-bodies takes over 9500ms of time to compile.</div><div class=""><br class=""></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(102, 102, 102);" class="">static func frustum(l: Float, r: Float, t: Float, b: Float, n: Float, f: Float) -&gt; float4x4 {</div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(102, 102, 102);" class="">&nbsp; &nbsp; return float4x4(rows: [</div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(102, 102, 102);" class="">&nbsp; &nbsp; &nbsp; &nbsp; [ 2 * n / (r - l), &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0,&nbsp; (r + l) / (r - l),&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0 ],</div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(102, 102, 102);" class="">&nbsp; &nbsp; &nbsp; &nbsp; [ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0, &nbsp; &nbsp; 2 * n / (t - b),&nbsp; (t + b) / (t - b),&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0 ],</div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(102, 102, 102);" class="">&nbsp; &nbsp; &nbsp; &nbsp; [ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0, -(f + n) / (f - n), -2 * f * n / (f - n) ],</div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(102, 102, 102);" class="">&nbsp; &nbsp; &nbsp; &nbsp; [ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; -1,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1 ],</div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(102, 102, 102);" class="">&nbsp; &nbsp; ])</div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(102, 102, 102);" class="">}</div></div><div class=""><br class=""></div><div class="">I’ve tried making some naive changes to the code and gotten it down to a much more reasonable 4ms, but the result is not something I would write if given a choice.</div><div class=""><br class=""></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(102, 102, 102);" class="">static func frustum(l: Float, r: Float, t: Float, b: Float, n: Float, f: Float) -&gt; float4x4 {</div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(102, 102, 102);" class="">&nbsp; &nbsp; let twoN = 2 * n</div><p style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(102, 102, 102); min-height: 13px;" class="">&nbsp;&nbsp; &nbsp;<br class="webkit-block-placeholder"></p><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(102, 102, 102);" class="">&nbsp; &nbsp; let rPlusL = r + l</div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(102, 102, 102);" class="">&nbsp; &nbsp; let rMinusL = r - l</div><p style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(102, 102, 102); min-height: 13px;" class="">&nbsp;&nbsp; &nbsp;<br class="webkit-block-placeholder"></p><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(102, 102, 102);" class="">&nbsp; &nbsp; let tPlusB = t + b</div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(102, 102, 102);" class="">&nbsp; &nbsp; let tMinusB = t - b</div><p style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(102, 102, 102); min-height: 13px;" class="">&nbsp;&nbsp; &nbsp;<br class="webkit-block-placeholder"></p><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(102, 102, 102);" class="">&nbsp; &nbsp; let fPlusN = f + n</div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(102, 102, 102);" class="">&nbsp; &nbsp; let fMinusN = f - n</div><p style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(102, 102, 102); min-height: 13px;" class="">&nbsp;&nbsp; &nbsp;<br class="webkit-block-placeholder"></p><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(102, 102, 102);" class="">&nbsp; &nbsp; return float4x4(rows: [</div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(102, 102, 102);" class="">&nbsp; &nbsp; &nbsp; &nbsp; [ twoN / rMinusL,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0,&nbsp; rPlusL / rMinusL, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0 ],</div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(102, 102, 102);" class="">&nbsp; &nbsp; &nbsp; &nbsp; [&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0, twoN / tMinusB,&nbsp; tPlusB / tMinusB, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0 ],</div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(102, 102, 102);" class="">&nbsp; &nbsp; &nbsp; &nbsp; [&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0, -fPlusN / fMinusN, -twoN * f / fMinusN ],</div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(102, 102, 102);" class="">&nbsp; &nbsp; &nbsp; &nbsp; [&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; -1, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1 ],</div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(102, 102, 102);" class="">&nbsp; &nbsp; ])</div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(102, 102, 102);" class="">}</div></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(102, 102, 102);" class=""><br class=""></div><div style="margin: 0px; line-height: normal;" class="">I’m taking this to swift-users since I’m aware this is a known pain point with the compiler. Is this specific instance something that would be worth filing a bug for?</div><div style="margin: 0px; line-height: normal;" class=""><br class=""></div><div style="margin: 0px; line-height: normal;" class="">Since I do not understand enough of the compiler to understand specifically what is causing problems with the first piece of code, I would also be extremely grateful if something from the core team (or anyone for that matter) could share some wisdom regarding what to do here.</div><div style="margin: 0px; line-height: normal;" class=""><br class=""></div><div style="margin: 0px; line-height: normal;" class="">Specifically, is there something that could be done to the first code to reduce the amount of overloads that the compiler needs to consider? In my naive view of the world, a sum or a multiplication between two Floats can only ever produce another Float, is there some way to pass this knowledge to the compiler?</div><div class=""><br class=""></div>Regards,<br class=""><div class="">
<div style="color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;">Elia Cereda</div>

</div>

<br class=""></body></html>