对于一个简单的源代码来说,Swift编译性能太慢了

对于一个简单的源代码来说,Swift编译性能太慢了,swift,xcode,performance,Swift,Xcode,Performance,我试图制作一个小的Swift 3代码,将声纳日期转换为农历日期。 一个非常小的代码,但是Xcode需要大约10分钟来编译它。 你能给我一些建议来提高性能吗。 这是我的swift代码: class DateExtensions { let PI: Double = M_PI func jdFromDate(day: Int, month: Int, year: Int) ->Int { let a: Int = (14 - month) / 12

我试图制作一个小的Swift 3代码,将声纳日期转换为农历日期。 一个非常小的代码,但是Xcode需要大约10分钟来编译它。 你能给我一些建议来提高性能吗。 这是我的swift代码:

class DateExtensions {
    let PI: Double = M_PI

    func jdFromDate(day: Int, month: Int, year: Int) ->Int {
        let a: Int = (14 - month) / 12
        let y: Int = year + 4800 - a
        let m: Int = month + 12 * a - 3
        var jd: Int = day + (153 * m + 2)/5 + 365 * y + y/4 - y/100 + y/400 - 32045

        if (jd < 2299161) {
            jd = day + (153 * m + 2)/5 + 365 * y + y/4 - 32083
        }

        return jd
    }

    func jdToDate(_ jd: Int) -> [Int] {
        var a: Int = 0
        var b: Int = 0
        var c: Int = 0

        if (jd > 2299160) { // After 5/10/1582, Gregorian calendar
            a = jd + 32044
            b = (4 * a + 3) / 146097
            c = a - (b * 146097) / 4
        } else {
            b = 0
            c = jd + 32082
        }
        let d: Int = (4 * c + 3)/1461
        let e: Int = c - (1461 * d)/4
        let m: Int = (5 * e + 2)/153
        let day: Int = e - (153 * m + 2)/5 + 1
        let month: Int = m + 3 - 12 * (m/10)
        let year: Int = b * 100 + d - 4800 + m/10

        return [day, month, year]
    }

    func SunLongitude(_ jdn: Double) -> Double {
        return SunLongitudeAA98(jdn)
    }

    func SunLongitudeAA98(_ jdn: Double) -> Double {
        let T: Double = (jdn - 2451545.0 ) / 36525 // Time in Julian centuries from 2000-01-01 12:00:00 GMT
        let T2: Double = T * T
        let dr: Double = PI/180 // degree to radian
        let M: Double = 357.52910 + 35999.05030 * T - 0.0001559 * T2 - 0.00000048 * T * T2 // mean anomaly, degree
        let L0: Double = 280.46645 + 36000.76983 * T + 0.0003032 * T2 // mean longitude, degree
        var DL: Double = (1.914600 - 0.004817 * T - 0.000014 * T2) * sin(dr * M)
        DL = DL + (0.019993 - 0.000101 * T) * sin(dr * 2 * M) + 0.000290 * sin(dr * 3 * M)
        var L: Double = L0 + DL // true longitude, degree
        L = Double(L - 360 * (INT(L/360))) // Normalize to (0, 360)

        return L
    }

    func NewMoon(_ k: Int) -> Double {
        return NewMoonAA98(k)
    }

    func NewMoonAA98(_ k: Int) -> Double {
        var T: Double = k/1236.85 // Time in Julian centuries from 1900 January 0.5
        var T2: Double = T * T
        var T3: Double = T2 * T
        var dr: Double = PI/180
        var Jd1: Double = Double(2415020.75933 + 29.53058868*k + 0.0001178*T2 - 0.000000155*T3)
        Jd1 = Jd1 + 0.00033*sin((166.56 + 132.87*T - 0.009173*T2)*dr) // Mean new moon
        var M: Double = Double(359.2242 + 29.10535608*k - 0.0000333*T2 - 0.00000347*T3) // Sun's mean anomaly
        var Mpr: Double = Double(306.0253 + 385.81691806*k + 0.0107306*T2 + 0.00001236*T3) // Moon's mean anomaly
        var F: Double = Double(21.2964 + 390.67050646*k - 0.0016528*T2 - 0.00000239*T3) // Moon's argument of latitude
        var C1: Double = (0.1734 - 0.000393*T)*sin(M*dr) + 0.0021*sin(2*dr*M)
        C1 = C1 - 0.4068*sin(Mpr*dr) + 0.0161*sin(dr*2*Mpr)
        C1 = C1 - 0.0004*sin(dr*3*Mpr)
        C1 = C1 + 0.0104*sin(dr*2*F) - 0.0051*sin(dr*(M+Mpr))
        C1 = C1 - 0.0074*sin(dr*(M-Mpr)) + 0.0004*sin(dr*(2*F+M))
        C1 = C1 - 0.0004*sin(dr*(2*F-M)) - 0.0006*sin(dr*(2*F+Mpr))
        C1 = C1 + 0.0010*sin(dr*(2*F-Mpr)) + 0.0005*sin(dr*(2*Mpr+M))
        var deltat: Double = 0

        if (T < -11) {
            deltat = 0.001 + 0.000839 * T + 0.0002261 * T2 - 0.00000845 * T3 - 0.000000081 * T * T3
        } else {
            deltat = -0.000278 + 0.000265 * T + 0.000262 * T2
        }

        let JdNew: Double = Jd1 + C1 - deltat

        return JdNew
    }

    func INT(_ d: Double) -> Int {
        return Int(exactly: floor(d))!
    }

    func getSunLongitude(_ dayNumber: Int, _ timeZone: Double) -> Double {
        return SunLongitude(dayNumber - 0.5 - timeZone/24)
    }

    func getNewMoonDay(_ k: Int, _ timeZone: Double) -> Int {
        let jd: Double = NewMoon(k)
        return INT(jd + 0.5 + timeZone/24)
    }

    func getLunarMonth11(_ yy: Int, _ timeZone: Double) -> Int {
        var off: Double = jdFromDate(31, 12, yy) - 2415021.076998695
        var k: Int = INT(off / 29.530588853)
        var nm: Int = getNewMoonDay(k, timeZone)
        var sunLong: Int = INT(getSunLongitude(nm, timeZone)/30)

        if (sunLong >= 9) {
            nm = getNewMoonDay(k-1, timeZone)
        }

        return nm
    }
    func getLeapMonthOffset(_ a11: Int, _ timeZone: Double) -> Int {
        var k: Int = INT(0.5 + (a11 - 2415021.076998695) / 29.530588853)
        var last: Int = 0 // Month 11 contains point of sun longutide 3*PI/2 (December solstice)
        var i: Int = 1 // We start with the month following lunar month 11
        var arc = INT(getSunLongitude(getNewMoonDay(k+i, timeZone), timeZone)/30)

        repeat {
            last = arc
            i = i + 1
            arc = INT(getSunLongitude(getNewMoonDay(k+i, timeZone), timeZone)/30)
        } while (arc != last && i < 14)

        return i - 1
    }

    func convertSolar2Lunar(_ dd: Int, _ mm: Int, _ yy: Int, _ timeZone: Double) -> [Int] {
        var lunarDay: Int = 0
        var lunarMonth: Int = 0
        var lunarYear: Int = 0
        var lunarLeap: Int = 0
        var dayNumber: Int = jdFromDate(dd, mm, yy)
        var k: Int = INT((dayNumber - 2415021.076998695) / 29.530588853)
        var monthStart: Int = getNewMoonDay(k + 1, timeZone)

        if (monthStart > dayNumber) {
            monthStart = getNewMoonDay(k, timeZone)
        }

        var a11: Int = getLunarMonth11(yy, timeZone)
        var b11: Int = a11

        if (a11 >= monthStart) {
            lunarYear = yy
            a11 = getLunarMonth11(yy-1, timeZone)
        } else {
            lunarYear = yy + 1
            b11 = getLunarMonth11(yy + 1, timeZone)
        }

        lunarDay = dayNumber - monthStart + 1
        var diff: Int = INT((monthStart - a11)/29)
        lunarLeap = 0
        lunarMonth = diff + 11

        if (b11 - a11 > 365) {
            var leapMonthDiff: Int = getLeapMonthOffset(a11, timeZone)
            if (diff >= leapMonthDiff) {
                lunarMonth = diff + 10
                if (diff == leapMonthDiff) {
                    lunarLeap = 1
                }
            }
        }
        if (lunarMonth > 12) {
            lunarMonth = lunarMonth - 12
        }
        if (lunarMonth >= 11 && diff < 4) {
            lunarYear = lunarYear - 1
        }
        return [lunarDay, lunarMonth, lunarYear, lunarLeap]
    }

    func convertLunar2Solar(_ lunarDay: Int, _ lunarMonth: Int, _ lunarYear: Int, _ lunarLeap: Int, _ timeZone: Double) -> [Int]{
        var a11: Int = 0
        var b11: Int = 0

        if (lunarMonth < 11) {
            a11 = getLunarMonth11(lunarYear-1, timeZone)
            b11 = getLunarMonth11(lunarYear, timeZone)
        } else {
            a11 = getLunarMonth11(lunarYear, timeZone)
            b11 = getLunarMonth11(lunarYear+1, timeZone)
        }

        var k: Int = INT(0.5 + (a11 - 2415021.076998695) / 29.530588853)
        var off: Int = lunarMonth - 11

        if (off < 0) {
            off = off + 12
        }

        if (b11 - a11 > 365) {
            var leapOff: Int = getLeapMonthOffset(a11, timeZone)
            var leapMonth: Int = leapOff - 2

            if (leapMonth < 0) {
                leapMonth = leapMonth + 12
            }

            if (lunarLeap != 0 && lunarMonth != leapMonth) {
                //debugPrint("Invalid input!")
                return new [0, 0, 0]
            } else if (lunarLeap != 0 || off >= leapOff) {
                off = off + 1
            }
        }

        let monthStart: Int = getNewMoonDay(k + off, timeZone)

        return jdToDate(monthStart+lunarDay-1)
    }
}
类扩展名{
设PI:Double=M_-PI
func jdFromDate(日:整数,月:整数,年:整数)->Int{
设a:Int=(14个月)/12
设y:Int=year+4800-a
设m:Int=month+12*a-3
变量jd:Int=day+(153*m+2)/5+365*y+y/4-y/100+y/400-32045
如果(jd<2299161){
jd=日+(153*m+2)/5+365*y+y/4-32083
}
返回jd
}
func jdToDate(jd:Int)->[Int]{
变量a:Int=0
变量b:Int=0
变量c:Int=0
如果(jd>2299160){//1582年10月5日之后,公历
a=jd+32044
b=(4*a+3)/146097
c=a-(b*146097)/4
}否则{
b=0
c=jd+32082
}
设d:Int=(4*c+3)/1461
设e:Int=c-(1461*d)/4
设m:Int=(5*e+2)/153
第二天:Int=e-(153*m+2)/5+1
月份:Int=m+3-12*(m/10)
年份:Int=b*100+d-4800+m/10
报税表[日、月、年]
}
func太阳经度(jdn:Double)->Double{
返回SunLongitudeAA98(jdn)
}
func SunLongitudeAA98(jdn:Double)->Double{
让T:Double=(jdn-2451545.0)/36525//2000-01-01 12:00:00 GMT开始的朱利安世纪时间
设T2:Double=T*T
设dr:Double=PI/180//弧度
设M:Double=357.52910+35999.05030*T-0.0001559*T2-0.00000048*T*T2//平均异常,度
设L0:Double=280.46645+36000.76983*T+0.0003032*T2//平均经度,度
变量DL:Double=(1.914600-0.004817*T-0.000014*T2)*sin(dr*M)
DL=DL+(0.019993-0.000101*T)*sin(dr*2*M)+0.000290*sin(dr*3*M)
变量L:Double=L0+DL//真实经度,度
L=Double(L-360*(INT(L/360))//标准化为(0360)
返回L
}
func NewMoon(k:Int)->Double{
返回新月AA98(k)
}
func NewMoonAA98(k:Int)->Double{
var T:Double=k/1236.85//朱利安世纪的时间,从1900年1月起0.5
变量T2:Double=T*T
变量T3:Double=T2*T
变量dr:Double=PI/180
变量Jd1:Double=Double(2415020.75933+29.53058868*k+0.0001178*T2-0.000000155*T3)
Jd1=Jd1+0.00033*sin((166.56+132.87*T-0.009173*T2)*dr)//平均新月
var M:Double=Double(359.2242+29.10535608*k-0.0000333*T2-0.00000347*T3)//太阳平均异常
var Mpr:Double=Double(306.0253+385.81691806*k+0.0107306*T2+0.00001236*T3)//月球平均异常
var F:Double=双(21.2964+390.67050646*k-0.0016528*T2-0.00000239*T3)//月球纬度论证
变量C1:Double=(0.1734-0.000393*T)*sin(M*dr)+0.0021*sin(2*dr*M)
C1=C1-0.4068*sin(最大持续功率*dr)+0.0161*sin(最大持续功率*2*Mpr)
C1=C1-0.0004*sin(dr*3*Mpr)
C1=C1+0.0104*sin(dr*2*F)-0.0051*sin(dr*(M+Mpr))
C1=C1-0.0074*sin(dr*(M-Mpr))+0.0004*sin(dr*(2*F+M))
C1=C1-0.0004*sin(dr*(2*F-M))-0.0006*sin(dr*(2*F+Mpr))
C1=C1+0.0010*sin(dr*(2*F-Mpr))+0.0005*sin(dr*(2*Mpr+M))
变量deltat:Double=0
如果(T<-11){
deltat=0.001+0.000839*T+0.0002261*T2-0.00000845*T3-0.000000081*T*T3
}否则{
deltat=-0.000278+0.000265*T+0.000262*T2
}
让JdNew:Double=Jd1+C1-deltat
返回新的
}
func INT(d:Double)->INT{
返回整数(准确地说:楼层(d))!
}
func getsunLength(uDayNumber:Int,u时区:Double)->Double{
返回太阳经度(日数-0.5-时区/24)
}
func getNewMoonDay(k:Int,u时区:Double)->Int{
让jd:Double=新月(k)
返回整数(jd+0.5+时区/24)
}
func getLunarMonth11(yy:Int,uo时区:Double)->Int{
var off:Double=jdFromDate(31,12,yy)-2415021.076998695
变量k:Int=Int(关闭/29.530588853)
var nm:Int=getNewMoonDay(k,时区)
var sunLong:Int=Int(getSunLongitude(nm,时区)/30)
如果(阳光>=9){
nm=getNewMoonDay(k-1,时区)
}
返回nm
}
func getLeapMonthOffset(a11:Int,u时区:Double)->Int{
变量k:Int=Int(0.5+(a11-2415021.076998695)/29.530588853)
var last:Int=0//11月包含sun longutide 3*PI/2点(12月至)
var i:Int=1//我们从农历11月的下一个月开始
var arc=INT(getSunLongitude(getNewMoonDay(k+i,时区),时区)/30)
重复{
最后=弧
i=i+1
arc=INT(getSunLongitude(getNewMoonDay(k+i,时区),时区)/30)
}while(弧!=最后一个&i<14)
返回i-1
}
func convertSolar2Lunar(dd:Int,mm:Int,yy:Int,uu时区:Double)->[Int]{
变量lunarDay:Int=0
变量lunarMonth:Int=0
变量lunarYear:Int=0
变量lunarLeap:Int=0
变量日数:Int=jdFromDate(日、月、年)
变量k:Int=Int((日数-2415021.076998695)/29.530588853)
var monthStart:Int=getNewMoonDay(k+1,时区)
如果(月开始>日数){
monthStart=getNewMoonDay(k,时区)
}
变量a11:Int=getLunarMonth11(yy,时区)
变量b11:Int=a11
如果(a11>=月开始){
月牙=yy
a11=getLunarMonth11(yy-1,时区)
}否则{
月牙=yy+1
b11=getLunarMonth11(yy+1,时区
//
//  DateExtensions.swift
//  Sonar2Lunar
//
//  Created by Nguyen Thanh Hai on 5/7/17.
//  Copyright © 2017 Nguyen Thanh Hai. All rights reserved.
//

import Foundation
import SwiftDate

class DateExtensions {
    let PI: Double = M_PI

    func jdFromDate(_ day: Int, _ month: Int, _ year: Int) ->Int {
        let a: Int = (14 - month) / 12
        let y: Int = year + 4800 - a
        let m: Int = month + 12 * a - 3
        var jd: Int = day + (153 * m + 2)/5 + 365 * y + y/4 - y/100 + y/400 - 32045

        if (jd < 2299161) {
            jd = day + (153 * m + 2)/5 + 365 * y + y/4 - 32083
        }

        return jd
    }

    func jdToDate(_ jd: Int) -> [Int] {
        var a: Int = 0
        var b: Int = 0
        var c: Int = 0

        if (jd > 2299160) { // After 5/10/1582, Gregorian calendar
            a = jd + 32044
            b = (4 * a + 3) / 146097
            c = a - (b * 146097) / 4
        } else {
            b = 0
            c = jd + 32082
        }
        let d: Int = (4 * c + 3)/1461
        let e: Int = c - (1461 * d)/4
        let m: Int = (5 * e + 2)/153
        let day: Int = e - (153 * m + 2)/5 + 1
        let month: Int = m + 3 - 12 * (m/10)
        let year: Int = b * 100 + d - 4800 + m/10

        return [day, month, year]
    }

    func INT(_ d: Double) -> Int {
        return Int(exactly: floor(d))!
    }

    func SunLongitude(_ jdn: Double) -> Double {
        return SunLongitudeAA98(jdn)
    }

    func SunLongitudeAA98(_ jdn: Double) -> Double {
        let T: Double = (jdn - 2451545.0 ) / 36525 // Time in Julian centuries from 2000-01-01 12:00:00 GMT
        let T2: Double = T * T
        let dr: Double = PI/180 // degree to radian
        let M: Double = 357.52910 + 35999.05030 * T - 0.0001559 * T2 - 0.00000048 * T * T2 // mean anomaly, degree
        let L0: Double = 280.46645 + 36000.76983 * T + 0.0003032 * T2 // mean longitude, degree
        var DL: Double = (1.914600 - 0.004817 * T - 0.000014 * T2) * sin(dr * M)
        DL = DL + (0.019993 - 0.000101 * T) * sin(dr * 2 * M) + 0.000290 * sin(dr * 3 * M)
        var L: Double = L0 + DL // true longitude, degree
        L = L - Double(360 * (INT(L/360))) // Normalize to (0, 360)

        return L
    }
}
func NewMoonAA98(_ k: Int) -> Double {
    var T: Double = k/1236.85 // Time in Julian centuries from 1900 January 0.5
    var T2: Double = T * T
    var T3: Double = T2 * T
    var dr: Double = PI/180
    var Jd1: Double = Double(2415020.75933 + 29.53058868*k + 0.0001178*T2 - 0.000000155*T3)
    var T: Double = k/1236.85 // Time in Julian centuries from 1900 January 0.5
    var T: Double = Double(k)/1236.85 // Time in Julian centuries from 1900 January 0.5
    var Jd1: Double = Double(2415020.75933 + 29.53058868*k + 0.0001178*T2 - 0.000000155*T3)
    var Jd1: Double = Double(2415020.75933 + 29.53058868*Double(k) + 0.0001178*T2 - 0.000000155*T3)