Hey Sam,

One thought: if you have an app with mixed objc and swift code, then the 
app-bridge.h and app-swift.h files might be creating massive choke points in 
your dependency graph. I have no idea how optimized the bridging functionality 
is but it has always seemed like a potentially weak part of the dependency 
management. I imagine that with an objc half and a swift half of the code base, 
every time you make a change in a swift file you trigger recompilation of the 
objc half, and vice versa. I'd love to hear from the core team to what extent 
this is true!

George



> On Apr 7, 2016, at 5:35 PM, Samantha John via swift-dev <swift-dev@swift.org> 
> wrote:
> 
> Thank you Jordan! This is a great starting off point.
> 
> I'm thinking about proposing a "strict import" mode in swift: A compile flag 
> that when turned on would require you to explicitly import any file that 
> contained a dependency you needed (like in objective-c).
> 
> I'm going to spend more time looking over the docs and the output logs to see 
> if this would be a feasible. If anyone has opinions or insights into this I 
> would love to hear from you. 
> 
> Sam
> 
> On Tue, Apr 5, 2016 at 9:08 PM, Jordan Rose <jordan_r...@apple.com 
> <mailto:jordan_r...@apple.com>> wrote:
> Hi, Sam. I don't think we currently have a good answer for this built into 
> xcodebuild or xctool, and it's a reasonable idea. (Ideally all builds would 
> be fast enough that it wouldn't matter! That's obviously not where we are.)
> 
> Since '-debug-time-function-bodies' is now public knowledge, I'll share 
> another one of our debugging flags, '-driver-show-incremental'. You can add 
> this to your "Other Swift Flags". The output isn't very detailed, though:
> 
> Queuing Tree.swift (initial)
> Queuing AdventureScene.swift (initial)
> Queuing AdventureScene.swift because of dependencies discovered later
> Queuing AppDelegate.swift because of dependencies discovered later
> Queuing ChaseArtificialIntelligence.swift because of dependencies discovered 
> later
> Queuing Character.swift because of dependencies discovered later
> Queuing SpawnArtificialIntelligence.swift because of dependencies discovered 
> later
> Queuing Goblin.swift because of dependencies discovered later
> Queuing Cave.swift because of dependencies discovered later
> Queuing AdventureSceneOSXEvents.swift because of dependencies discovered later
> Queuing HeroCharacter.swift because of dependencies discovered later
> Queuing EnemyCharacter.swift because of dependencies discovered later
> Queuing Boss.swift because of dependencies discovered later
> Queuing SharedAssetManagement.swift because of dependencies discovered later
> Queuing Warrior.swift because of dependencies discovered later
> Queuing Archer.swift because of dependencies discovered later
> Queuing Player.swift because of dependencies discovered later
> Queuing ArtificialIntelligence.swift because of dependencies discovered later
> 
> In this case, I took a version of the Adventure sample project and modified 
> "Tree.swift"; that triggered recompilation of several other files. 
> Unfortunately this view doesn't tell you how they're related, only which ones 
> are actually getting rebuilt.
> 
> The next step (and moving into the territory of "working on Swift" rather 
> than just "trying to figure out why it's repeating work") would be to look at 
> the "swiftdeps" files stored in your DerivedData folder. These are currently 
> just YAML files describing what Swift thinks the file depends on, as well as 
> what will trigger rebuilding of other files. This is intended to be a 
> conservative estimate, since not recompiling something would result in an 
> invalid binary. (Unfortunately I say "intended" because there are known bugs; 
> fortunately, archive builds are always clean builds anyway.)
> 
> There's a document in the Swift repo describing the logic behind Swift's 
> dependency analysis: 
> https://github.com/apple/swift/blob/master/docs/DependencyAnalysis.rst 
> <https://github.com/apple/swift/blob/master/docs/DependencyAnalysis.rst>. The 
> one thing that's not in there is the notion of changes that don't affect 
> other files at all. This is accomplished by computing a hash of all the 
> tokens that could affect other files, and seeing if that hash has changed.
> 
> We definitely have room for improvement here.
> 
> Jordan
> 
> 
>> On Mar 31, 2016, at 11:24 , Samantha John via swift-dev <swift-dev@swift.org 
>> <mailto:swift-dev@swift.org>> wrote:
>> 
>> I have a large project (308 swift files, 441 objective c, 66k lines of code) 
>> where incremental builds can be extremely slow. I'm trying to do some 
>> profiling to figure out what type of things cause large scale recompiles. 
>> The problem is that I can't find a good way of telling which files get 
>> recompiled on an incremental build and which do not. It seems like files 
>> that are not recompiled still get listed in xcode, but the compiler just 
>> passes over them really fast. 
>> 
>> Does anyone know if xctool or xcodebuild has this type of functionality? Or 
>> is there some other way to get this info?
>> 
>> Thank you,
>> Sam
>> _______________________________________________
>> swift-dev mailing list
>> swift-dev@swift.org <mailto:swift-dev@swift.org>
>> https://lists.swift.org/mailman/listinfo/swift-dev 
>> <https://lists.swift.org/mailman/listinfo/swift-dev>
> 
> 
> _______________________________________________
> swift-dev mailing list
> swift-dev@swift.org
> https://lists.swift.org/mailman/listinfo/swift-dev

_______________________________________________
swift-dev mailing list
swift-dev@swift.org
https://lists.swift.org/mailman/listinfo/swift-dev

Reply via email to