[swift-users] Compile time exceeded. Anything wrong?
Jens Persson
jens at bitcycle.com
Tue Jun 6 07:49:37 CDT 2017
You're right that it's not functionally eq, sorry about that.
I filed https://bugs.swift.org/browse/SR-5093 containing a reduced example
program to demonstrate the issue..
Haven't tested it with anything later than the 2017-06-02 snapshot.
But it shows that it's not just max that is the problem.
/Jens
On Tue, Jun 6, 2017 at 4:51 AM, Geordie Jay <geojay at gmail.com> wrote:
> I doubt it'll be "fixed" in the next release (which came out less than 24
> hours ago), but I gather type checker speed optimisations and fixing
> crashes are ongoing goals of the compiler team. With no guarantees or
> expectations, you may find your code compiles in an acceptable time with
> Swift 4 (Xcode 9).
>
> Cheers,
> Geordie
>
> On Tue 6. Jun 2017 at 12:29, <www.hbu.cn at 163.com> wrote:
>
>> thanks, guys! dp array should be var, not let, but the compile run too
>> slow. It indeed a bug. Optimizing the code for the compiling time is
>> really a headache for coders. I am using the Xcode 8.1. Hoping it can be
>> fixed in next release.
>>
>>
>> *best wishes for you *
>>
>> 2017-06-06 8:57 GMT+08:00 Geordie J <geojay at gmail.com>:
>>
>>>
>>> Am 06.06.2017 um 09:02 schrieb Jens Persson via swift-users <
>>> swift-users at swift.org>:
>>>
>>> When compiling that from the command line, I get the following (after
>>> about 6 seconds):
>>>
>>> test.swift:7:18: error: cannot assign through subscript: 'dp' is a 'let'
>>> constant
>>> dp[0][0] = 0
>>> ~~ ^
>>> /.../
>>>
>>> After fixing that (changing let dp to var dp), it will compile
>>> successfully, still taking a very long time though. This usually means that
>>> some expression(s) in the code happen to be a bit hard on the type checker
>>> (in its current state).
>>> I tried the latest dev snapshot and it is a bit faster, perhaps 3 s
>>> instead of 6.
>>>
>>> Anyway, here is a logically equivalent rewrite which will compile faster:
>>>
>>> class Solution {
>>> func rob(nums: [Int]) -> Int {
>>> guard nums.count > 0 else { return 0 }
>>> var dp = Array.init(repeating: Array.init(repeating: 0, count:
>>> nums.count),
>>> count: 2)
>>> dp[0][0] = 0
>>> dp[0][1] = nums[0]
>>> for i in 1 ..< nums.count {
>>> let dp_iMinus1_0 = dp[i - 1][0]
>>> let dp_iMinus1_1 = dp[i - 1][1]
>>> dp[i][0] = max(dp_iMinus1_0, dp_iMinus1_1)
>>> dp[i][1] = dp_iMinus1_0 + nums[i]
>>>
>>>
>>> Just a nitpick: this isn’t functionally equivalent to the original code
>>> (dp[i][1] = dp[i][0] + nums[i]), because dp[i][0] might have actually
>>> changed on the previous line. But you can return this line to the original
>>> version without any effect on the compile time (less than 250ms on my
>>> machine).
>>>
>>> I think the compile time issue is that max() is a generic function that
>>> takes any Comparable, so the type checker seems to go berserk trying to
>>> ensure the term is satisfiable.
>>>
>>> If you create a non-generic replacement for max in the same file:
>>>
>>> private func myMax(_ x1: Int, _ x2: Int) -> Int {
>>> return (x1 >= x2) ? x1 : x2
>>> }
>>>
>>> … and replace the assignment to *max(dp[i - 1][0], ……)* in the for loop
>>> with *myMax(dp[i - 1][0], ….)*
>>>
>>> The compile time will be just as fast as the one that swaps out the
>>> internal elements (on my machine it’s actually about 10% faster with the
>>> non-generic *max*).
>>>
>>> Regards,
>>> Geordie
>>>
>>> }
>>> return 0
>>> }
>>> }
>>>
>>>
>>>
>>>
>>>
>>> On Mon, Jun 5, 2017 at 2:32 PM, Hbucius Smith via swift-users <
>>> swift-users at swift.org> wrote:
>>>
>>>> Hi Swift-Users,
>>>>
>>>> when I compiled the code, Xcode cannot stop, I do not know why. It
>>>> is very strange. Can anyone help ? Here is the code. I am using Xcode 8.1
>>>>
>>>> class Solution {
>>>>
>>>> func rob(nums: [Int]) -> Int {
>>>>
>>>> guard nums.count > 0 else { return 0 }
>>>>
>>>> let dp = Array.init(repeating: Array.init(repeating: 0, count:
>>>> nums.count),
>>>>
>>>> count: 2)
>>>>
>>>> dp[0][0] = 0
>>>>
>>>> dp[0][1] = nums[0]
>>>>
>>>> for i in 1 ..< nums.count {
>>>>
>>>> dp[i][0] = max(dp[i - 1][0], dp[i - 1][1])
>>>>
>>>> dp[i][1] = dp[i - 1][0] + nums[i]
>>>>
>>>> }
>>>>
>>>> return 0
>>>>
>>>> }
>>>>
>>>> }
>>>>
>>>>
>>>>
>>>> *best wishes for you *
>>>>
>>>> _______________________________________________
>>>> swift-users mailing list
>>>> swift-users at swift.org
>>>> https://lists.swift.org/mailman/listinfo/swift-users
>>>>
>>>>
>>> _______________________________________________
>>> swift-users mailing list
>>> swift-users at swift.org
>>> https://lists.swift.org/mailman/listinfo/swift-users
>>>
>>>
>>>
>>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-users/attachments/20170606/cf6bf96b/attachment.html>
More information about the swift-users
mailing list