2011-12-05 7 views
28

Apple đang đề xuất biên dịch cho ARM thay vì ngón tay cái nếu có nhiều thao tác dấu phẩy động đang diễn ra. Toàn bộ ứng dụng của tôi gần như là một hoạt động điểm nổi lớn.Có cách nào để biên dịch cho ARM thay vì Thumb trong Xcode 4 không?

Dưới đây là những gì họ nói trong ứng dụng iOS Phát triển Workflow Guide:

thiết bị iOS hỗ trợ hai bộ giảng dạy, ARM và Thumb. Xcode sử dụng Hướng dẫn bằng ngón tay cái theo mặc định vì sử dụng Thumb thường làm giảm kích thước mã khoảng 35% so với ARM. Các ứng dụng có mã dấu phẩy động mở rộng có thể hoạt động tốt hơn nếu chúng sử dụng các hướng dẫn ARM thay vì Thumb. Bạn có thể tắt Thumb cho các ứng dụng của bạn, vì vậy nó biên dịch cho ARM, bằng cách thiết lập Compile cho Thumb xây dựng thiết lập vị trí thứ

Tuy nhiên, tôi không thể tìm thấy bất kỳ "biên dịch cho Thumb" thiết lập trong cài đặt build của tôi . Họ đã đổi tên nó chưa? Hoặc hiện không khả dụng với Xcode 4?

Trả lời

48

Trước tiên, lời khuyên không biên dịch cho tập lệnh Thumb để cải thiện hiệu suất điểm nổi chỉ thực sự áp dụng cho các thiết bị ARMv6 cũ.

Phần cứng ARMv7 (iPhone 3G S và mới hơn, bao gồm tất cả iPad) sử dụng tập lệnh Thumb-2 hiệu quả hơn, không bị suy giảm cùng một điểm nổi. Đối với các bản xây dựng ARMv7, bạn nên sử dụng hầu hết mọi trường hợp mà bạn xây dựng cho Thumb. Tôi cung cấp thêm một chút chi tiết về điều này trong câu trả lời của tôi here.

Điều này có thể là lý do tại sao cài đặt trình biên dịch này không còn được hiển thị dưới dạng tùy chọn chung vì thiết bị ARMv7 chiếm phần lớn các thiết bị iOS trên mạng.

Nếu bạn muốn thực hiện điều này chỉ cho bản dựng ARMv6, bạn có thể chuyển đến cài đặt xây dựng và di chuột qua tùy chọn "Cờ C khác". Nhấp vào nút dấu cộng nhỏ xuất hiện ở bên phải của tùy chọn này và thêm điều kiện cho kiến ​​trúc ARMv6. Thực hiện lại thao tác này để tạo một cấu trúc cho kiến ​​trúc ARMv7. Theo kiến ​​trúc ARMv6, thêm cờ trình biên dịch bổ sung của -mno-thumb (như Kevin gợi ý).

Bạn nên kết thúc với cái gì đó trông giống như sau:

Build settings for ARMv6

Tôi làm điều này trong một trong những ứng dụng của tôi, bởi vì tôi đã nhìn thấy một tăng hiệu suất trên các thiết bị ARMv6 cũ với điều đó. Tuy nhiên, một ứng dụng khác của tôi chậm hơn khi không xây dựng cho Thumb trên ARMv6, vì vậy bạn sẽ muốn cấu hình đầu tiên này.

Ngoài ra, có currently a bug in the LLVM Compiler 3.0 that ships with Xcode 4.2 (từ đó đã được sửa trong 4.2.1, từ những gì tôi nghe) khi tính toán dấu phẩy động được biên dịch sai dưới Thumb for ARMv6. Nếu bạn đang sử dụng phiên bản Xcode cụ thể đó, bạn sẽ cần thực hiện việc này cho hành vi thích hợp trên các thiết bị cũ hơn.

+0

Xcode 4.2.1 dường như chỉ dành cho Lion. Sẽ sử dụng nó nếu Photoshop và một loạt các ứng dụng khác sẽ không có vấn đề lớn với Lion. Chỉ trích. Có cách giải quyết nào cho lỗi đó trong Xcode 4.2 không? Bạn có thể chỉ ra phải làm gì trong trường hợp Lion không phải là một lựa chọn? – openfrog

+1

@openfrog - Chỉ cần không xây dựng cho ngón tay cái khi nhắm mục tiêu ARMv6 trong trường hợp đó, như tôi đã trình bày ở trên. ARMv7 không có vấn đề như vậy, và có thể được xây dựng bằng cách sử dụng chỉ dẫn Thumb tốt. Thành thật mà nói, vô hiệu hóa Thumb cho ARMv6 sẽ không ảnh hưởng đến nhiều người dùng của bạn nếu nó gây ra sự chậm lại, như ước tính đặt các thiết bị ARMv6 ở 3-5% các thiết bị iOS đang hoạt động hiện có: http://www.marco.org/ 2011/11/30/hơn-ios-thiết bị-và-os-phiên bản-số liệu thống kê-từ-instapaper –

+0

Sweeeeet! Cảm ơn rất nhiều! –

8

Tôi không biết có hay không "Biên dịch cho ngón tay cái" được cho là tồn tại trong Xcode 4, nhưng bạn luôn có thể thêm -mno-thumb vào Cờ C khác cài đặt xây dựng.

3

Về câu hỏi ban đầu: Tôi đã nhận thấy rằng "Biên dịch cho ngón tay cái" (trong phần "Tạo mã" của "Thiết lập bản dựng dự án") trong Xcode 4.2.1 chỉ khả dụng nếu bạn đang sử dụng LLVM GCC 4.2 (nếu được đặt trong "Trình biên dịch cho C/C++/Mục tiêu-C")!

Nếu biên soạn với Apple LLVM 3.0 thì bạn sẽ không tìm thấy tùy chọn "Biên dịch cho ngón tay cái". Nhưng - như Brad đã nói - bạn vẫn có thể thay đổi tùy chọn "Other C Flags" để tắt chế độ Thumb.

Một điểm thú vị khác: Tôi đang sử dụng nguồn hỗn hợp sqlite trong dự án của mình (tôi cần fts - tìm kiếm văn bản đầy đủ) và biên dịch với LLVM 3.0 Tôi gặp sự cố lạ và ngẫu nhiên trên thiết bị armv6 bất cứ khi nào truy cập cơ sở dữ liệu hóa ra là do chế độ Thumb không bị tắt khi biên dịch cho các thiết bị armv6.

+0

tôi cũng dự kiến ​​gặp sự cố sqlite trên armv6, nhưng chỉ khi tôi xây dựng thư viện với gcc llvm. sau khi chuyển sang llvm - nó hoạt động tốt. –