kêu vang vs gcc - optimization bao gồm operator mới


0 Phiếu
Đã hỏi 25/5/2016 bởi gur8787 (250 điểm) 1 Phản ánh
Tôi đã ví dụ đơn giản này, tôi đã thử nghiệm chống lại và tôi nhận thấy rằng gcc tối ưu hóa (-O3) dường như không tốt như kêu vang những khi tham gia operator mới . Tôi đã tự hỏi những gì có thể là vấn đề và nếu nó có thể ép buộc gcc để sản xuất tối ưu hóa nhiều hơn code nào đó?
template<typename T>
T* create() { return new T(); }
int main() {
    auto result = 0;
    for (auto i = 0; i < 1000000; ++i) {
        result += (create<int>() != nullptr);
    }
    return result;
}

#clang3.6++ -O3 -s --std=c++11 test.cpp
#size a.out
   text    data     bss     dec     hex filename
   1324     616       8    1948     79c a.out
#time ./a.out 
real 0m0.002s
user 0m0.001s
sys  0m0.000s
#gcc4.9 -O3 -s --std=c++11 test.cpp
#size a.out
   text    data     bss     dec     hex filename
   1484     624       8    2116     844 a.out
#time ./a.out
real 0m0.045s
user 0m0.035s
sys  0m0.009s
ví dụ trên là chỉ là một phiên bản đơn giản của code tôi đã thử nghiệm ban đầu, nhưng nó vẫn còn minh họa sự khác biệt giữa gcc/kêu vang. Tôi đã kiểm tra code hội là tốt và không phải là một sự khác biệt rất lớn trong kích thước, nhưng chắc chắn trong hiệu suất. Mặt khác có thể kêu vang đang làm một cái gì đó mà không được phép?

2 Câu trả lời

0 Phiếu
Đã trả lời 04/6/2016 bởi vMulik (140 điểm)
Nếu chúng tôi cắm này code thành godbolt chúng tôi có thể thấy rằng clang tối ưu hóa đi code này:
main:                                   # @main
movl    $1000000, %eax          # imm = 0xF4240
ret
trong khi gcc không thực hiện tối ưu hóa này. Vì vậy, câu hỏi đây có phải là một tối ưu hóa hợp lệ? Điều này không làm theo as-if rule, mà được ghi nhận trong dự thảo C++ tiêu chuẩn phần 1.9 chương trình thực hiện mà nói ( nhấn mạnh mỏ ):
mô tả ngữ nghĩa trong này tiêu chuẩn quốc tế xác định parameterized nondeterministic tóm tắt máy. Này tiêu chuẩn quốc tế nơi yêu cầu không có trên structure phù hợp triển khai. Đặc biệt, họ không cần sao chép hoặc thi đua structure máy tính trừu tượng. Thay vào đó, triển khai phù hợp là cần thiết để thi đua (chỉ) quan sát hành vi của máy tính trừu tượng như được giải thích dưới đây. 5
nơi lưu ý 5 nói:
quy định này là đôi khi được gọi là "như là-nếu" cai trị , bởi vì việc thực hiện là miễn phí để bỏ qua bất cứ yêu cầu của này chuẩn quốc tế như là kết quả nếu như yêu cầu đã được tuân thủ, như xa như có thể được xác định từ quan sát hành vi của chương trình. Ví dụ, một thực hiện thực tế không cần đánh giá một phần của một expression nếu nó có thể suy ra rằng value của nó không được sử dụng và không có tác dụng phụ ảnh hưởng đến hành vi quan sát của program được sản xuất.
từ new có thể ném một exception mà đã có thể quan sát được hành vi vì nó sẽ làm thay đổi value trở lại của chương trình, này có vẻ giống như một optimization quá tích cực với tôi. R.MartinhoFernandes lập luận rằng đó là việc thực hiện chi tiết khi để ném một exception và do đó clang có thể quyết định tình huống này sẽ không gây ra một exception và do đó eliding new gọi sẽ không vi phạm as-if rule. Điều này có vẻ giống như một đối số hợp lý cho tôi và vì vậy, tôi đang làm thay đổi kết luận của tôi, đây là một optimization hợp lệ và gcc chỉ cần lựa chọn không để tận dụng lợi thế của nó. nhưng như T.C. chỉ ra:
một sự thay thế toàn cầu operator mới có thể đã được xác định trong một đơn vị khác nhau dịch
Casey cung cấp một ví dụ rằng ngay cả khi clang thấy đó là một thay thế mà nó vẫn thực hiện optimization này cho thấy mặc dù có bị mất tác dụng phụ. Vì vậy, điều này có vẻ như tối ưu hóa quá tích cực. Lưu ý, rò rỉ bộ nhớ không undefined hành vi .
Đã bình luận 06/6/2016 bởi jvq4816 (280 điểm)
Bằng cách sử dụng [godbolt] (http://gcc.godbolt.org/#) trong ví dụ này 'kêu vang' có vẻ như để tối ưu hóa đi tất cả code để một 'movl $ 1000000, % eax' trong khi 'gcc' không.
Đã bình luận 06/6/2016 bởi VfAcahn (150 điểm)
điểm tốt, do đó, câu hỏi sẽ là nếu operator mới có thể là một phần của như-nếu quy tắc hay không?
+1 Phiếu
Đã trả lời 04/6/2016 bởi wants (600 điểm)
Nếu chúng tôi cắm này code thành godbolt chúng tôi có thể thấy rằng clang tối ưu hóa đi code này:
main:                                   # @main
movl    $1000000, %eax          # imm = 0xF4240
ret
trong khi gcc không thực hiện tối ưu hóa này. Vì vậy, câu hỏi đây có phải là một tối ưu hóa hợp lệ? Điều này không làm theo as-if rule, mà được ghi nhận trong dự thảo C++ tiêu chuẩn phần 1.9 chương trình thực hiện mà nói ( nhấn mạnh mỏ ):
mô tả ngữ nghĩa trong này tiêu chuẩn quốc tế xác định parameterized nondeterministic tóm tắt máy. Này tiêu chuẩn quốc tế nơi yêu cầu không có trên structure phù hợp triển khai. Đặc biệt, họ không cần sao chép hoặc thi đua structure máy tính trừu tượng. Thay vào đó, triển khai phù hợp là cần thiết để thi đua (chỉ) quan sát hành vi của máy tính trừu tượng như được giải thích dưới đây. 5
nơi lưu ý 5 nói:
quy định này là đôi khi được gọi là "như là-nếu" cai trị , bởi vì việc thực hiện là miễn phí để bỏ qua bất cứ yêu cầu của này chuẩn quốc tế như là kết quả nếu như yêu cầu đã được tuân thủ, như xa như có thể được xác định từ quan sát hành vi của chương trình. Ví dụ, một thực hiện thực tế không cần đánh giá một phần của một expression nếu nó có thể suy ra rằng value của nó không được sử dụng và không có tác dụng phụ ảnh hưởng đến hành vi quan sát của program được sản xuất.
từ new có thể ném một exception mà đã có thể quan sát được hành vi vì nó sẽ làm thay đổi value trở lại của chương trình, này có vẻ giống như một optimization quá tích cực với tôi. R.MartinhoFernandes lập luận rằng đó là việc thực hiện chi tiết khi để ném một exception và do đó clang có thể quyết định tình huống này sẽ không gây ra một exception và do đó eliding new gọi sẽ không vi phạm as-if rule. Điều này có vẻ giống như một đối số hợp lý cho tôi và vì vậy, tôi đang làm thay đổi kết luận của tôi, đây là một optimization hợp lệ và gcc chỉ cần lựa chọn không để tận dụng lợi thế của nó. nhưng như T.C. chỉ ra:
một sự thay thế toàn cầu operator mới có thể đã được xác định trong một đơn vị khác nhau dịch
Casey cung cấp một ví dụ rằng ngay cả khi clang thấy đó là một thay thế mà nó vẫn thực hiện optimization này cho thấy mặc dù có bị mất tác dụng phụ. Vì vậy, điều này có vẻ như tối ưu hóa quá tích cực. Lưu ý, rò rỉ bộ nhớ không undefined hành vi .
Đã bình luận 06/6/2016 bởi Uni_9354 (170 điểm)
Vâng, nó thực sự là có dây, tôi mệt mỏi chỉ với value ngữ nghĩa - http://goo.gl/ h3S47K - và gcc tối ưu hóa tất cả code theo cùng một cách như là kêu vang, nhưng bất cứ khi nào operator mới được sử dụng - http://goo.gl/ 3129uS - sau đó optimization không được áp dụng, đã tự hỏi tại sao?
Đã bình luận 06/6/2016 bởi BoyanAn (180 điểm)
Tôi cho rằng nó phụ thuộc cho dù kêu vang optimization là làm thác theo như là-nếu quy tắc hay không.

ToughDev Q&A là gì?

Trang web hỏi đáp cho các bạn đam mê lập trình, phát triển phần mềm và các vấn đề kỹ thuật khác. Với sự giúp đỡ của bạn, chúng tôi hy vọng sẽ xây dựng thành công một thư viện đầy đủ các câu hỏi và trả lời về tất cả các vấn đề có liên quan đến lập trình!







...