2009-10-22 33 views
9

Hãy thử xem diễn viên nào nhanh hơn (không cần thiết tốt hơn): trường hợp C++ mới hoặc dàn diễn viên kiểu C thời trang cũ. Bất kỳ ý tưởng?mà cast nhanh hơn static_cast <int>() hoặc int()

+1

bạn luôn có thể viết kịch bản điểm chuẩn. Chỉ cần làm 10 triệu static_cast và 10 triệu int int, và xem cái nào mất nhiều thời gian hơn. * đoán * của tôi là chúng sẽ biên dịch theo hướng dẫn lắp ráp giống nhau. – Kip

+12

Bỏ qua thực tế là họ gần như chắc chắn biên dịch giống nhau trên tất cả các trình biên dịch, tại sao điều này lại quan trọng? Trừ khi bạn đã biết các vấn đề về hiệu suất, bạn viết để rõ ràng và tránh vi mô khó đọc hơn có lẽ là vô nghĩa. Sử dụng static_cast (). –

+3

phôi kiểu C được xác định theo dạng C++ kiểu phôi (và phôi kiểu c có thể đúc thành cơ sở riêng ...). Vì vậy, chúng thực sự khá giống nhau. không ai có tăng hiệu suất so với người khác. –

Trả lời

33

Sẽ hoàn toàn không có sự khác biệt nếu bạn so sánh int() với tương đương chức năng của static_cast<int>().

Sử dụng VC2008:

double d = 10.5; 
013A13EE fld   qword ptr [[email protected] (13A5840h)] 
013A13F4 fstp  qword ptr [d] 
    int x = int(d); 
013A13F7 fld   qword ptr [d] 
013A13FA call  @ILT+215(__ftol2_sse) (13A10DCh) 
013A13FF mov   dword ptr [x],eax 
    int y = static_cast<int>(d); 
013A1402 fld   qword ptr [d] 
013A1405 call  @ILT+215(__ftol2_sse) (13A10DCh) 
013A140A mov   dword ptr [y],eax 

Rõ ràng, đó là 100% giống nhau!

+8

+1. Hội luôn luôn là tốt đẹp cho những thứ như vậy. – Joey

+0

Điều này không có vẻ gợi cảm với tôi :) Một người gợi cảm sẽ sử dụng hướng dẫn SSE mà không liên quan đến FPU chút nào :) (Tôi nghĩ SSE đã được mặc định sử dụng trong VC). – AnT

+0

@AndreyT Nó có :) mã trong câu trả lời được tạo trong chế độ gỡ lỗi. Nếu bạn cố gắng biên dịch nó với các tối ưu hóa, nó sẽ sử dụng các lệnh SSE. – AraK

2

Hãy xem hội đồng sử dụng từng phương pháp. Nếu nó khác nhau sử dụng một hồ sơ.

1

Chúng giống nhau vì nó được giải quyết trong thời gian biên dịch và không có chi phí thời gian chạy. Ngay cả khi có một số khác biệt, tôi thực sự sẽ không bận tâm quá nhiều về những tối ưu hóa nhỏ bé (thậm chí không vi mô).

3

Không có sự khác biệt nào.

Khi nói đến các cấu trúc cơ bản như một diễn viên, khi hai cấu trúc có cùng ý nghĩa ngữ nghĩa, hiệu suất của chúng sẽ giống hệt nhau và mã máy được tạo cho các cấu trúc này sẽ giống nhau.

-2

Khi bạn lựa chọn tạo ra sự khác biệt nhỏ cho mã, tôi sẽ chọn một mã có vẻ quen thuộc hơn với các lập trình viên sau này. Làm cho mã dễ hiểu hơn bởi người khác luôn đáng xem xét. Trong trường hợp này, tôi sẽ dính vào int(…) vì lý do đó.

+0

Tại sao bạn cho rằng int (...) sẽ quen thuộc hơn? Nó thực sự xuất hiện không hợp lệ trong C, có lẽ là một cuộc gọi "giả tạo" của C++. - Ngoài ra, bằng cách không rõ ràng về loại dàn diễn viên, tại sao nó làm cho mã dễ hiểu hơn? – UncleBens

+0

Hành vi không có gì để được chơi đùa và do đó sẽ dễ dàng phát hiện. Đó là những gì các phôi kiểu C++. – foraidt

3

Tôi tin rằng kết quả thực tế được thực hiện được xác định. Bạn nên kiểm tra nó trong phiên bản trình biên dịch của bạn. Nhưng tôi tin rằng nó sẽ cho kết quả tương tự trong hầu hết các trình biên dịch hiện đại. Và trong C++ bạn không nên sử dụng C-cast, thay vì sử dụng C++ casts - nó sẽ cho phép bạn tìm lỗi tại thời gian biên dịch.

+0

+1 để đề cập đến kiểm tra thời gian biên dịch – foraidt

+0

Các vấn đề về hiệu suất không được xác định thực hiện (trên thực tế, tiêu chuẩn không ủy thác bất kỳ hiệu suất nào, ngoài big-O cho hoạt động của vùng chứa) –

0

Như hầu hết mọi người đều nói rằng một trong những hy vọng này sẽ là cùng một tốc độ, mặc dù bạn đang ở lòng thương xót của trình biên dịch của bạn ... và đó không phải luôn luôn là một tình huống rất hạnh phúc. Đọc tiếp cho những câu chuyện chiến tranh.

Tùy thuộc vào trình biên dịch của bạn và mô hình cụ thể của lõi vi xử lý mà chương trình thực thi trên tốc độ của float f; int i(f);, float f; int i = (int)f;float f; int i = static_cast<int>(f); và ilk của họ (bao gồm cả biến thể liên quan đến các loại đôi, dài và unsigned) có thể atrociously chậm - một thứ tự tầm quan trọng tồi tệ hơn bạn mong đợi. Trình biên dịch có thể phát ra các lệnh thay đổi các chế độ xử lý nội bộ khiến cho các đường dẫn lệnh bị vứt bỏ. Đây là, trong thực tế, một lỗi trong phần tử tối ưu hóa của trình biên dịch. Tôi đã nhìn thấy trường hợp mà một trong những bị chi phí 40-đồng hồ chu kỳ đề cập trong this analysis, tại thời điểm đó bạn có một nút cổ chai hiệu suất lớn, bất ngờ và khó chịu với AFAIK không hoàn toàn dễ chịu, mạnh mẽ, giải pháp chung chung. Có những lựa chọn thay thế liên quan đến assembler nhưng AFAIK chúng không làm tròn điểm động tới số nguyên theo cách tương tự như các phôi làm. Nếu có ai biết tốt hơn tôi quan tâm. Tôi hy vọng vấn đề này là/sẽ sớm được giới hạn trong các trình biên dịch/phần cứng cũ nhưng bạn cần trí thông minh của mình về bạn.

P.S. Tôi không thể đạt được liên kết đó vì tường lửa của tôi chặn nó như là trò chơi liên quan nhưng a Google cache of it đủ để chứng minh rằng tác giả của nó biết nhiều hơn về nó hơn tôi.

Các vấn đề liên quan