Vì vậy, tôi đã chơi xung quanh với một số mã và muốn xem phương pháp chuyển đổi một std :: string to upper case là hiệu quả nhất. Tôi nghĩ rằng hai người sẽ có phần tương tự như hiệu suất-khôn ngoan, nhưng tôi đã sai lầm khủng khiếp. Bây giờ tôi muốn tìm hiểu lý do tại sao. Phương pháp đầu tiên để chuyển đổi chuỗi hoạt động như sau: cho mỗi ký tự trong chuỗi (lưu độ dài, lặp lại từ 0 đến chiều dài), nếu nó nằm giữa 'a' và 'z', sau đó dịch chuyển nó sao cho nó giữa 'A' và 'Z' thay thế. Phương thức thứ hai hoạt động như sau: đối với mỗi ký tự trong chuỗi (bắt đầu từ 0, tiếp tục cho đến khi chúng ta nhấn một terminator null), áp dụng hàm xây dựng trong hàm toupper().Chuyển đổi std :: chuỗi thành chữ hoa: sự khác biệt hiệu suất chính?
Dưới đây là các mã:
#include <iostream>
#include <string>
inline std::string ToUpper_Reg(std::string str)
{
for (int pos = 0, sz = str.length(); pos < sz; ++pos)
{
if (str[pos] >= 'a' && str[pos] <= 'z') { str[pos] += ('A' - 'a'); }
}
return str;
}
inline std::string ToUpper_Alt(std::string str)
{
for (int pos = 0; str[pos] != '\0'; ++pos) { str[pos] = toupper(str[pos]); }
return str;
}
int main()
{
std::string test = " [email protected]#$%^&*()_+=-`'{}[]\\|\";:<>,./?";
for (size_t i = 0; i < 100000000; ++i) { ToUpper_Reg(test); /* ToUpper_Alt(test); */ }
return 0;
}
Phương pháp đầu tiên ToUpper_Reg
mất khoảng 169 giây mỗi 100 triệu lần lặp lại.
Phương pháp thứ hai Toupper_Alt
mất khoảng 379 giây cho mỗi 100 triệu lần lặp lại.
Điều gì mang lại?
Edit: Tôi đã thay đổi phương pháp thứ hai để nó lặp chuỗi như thế nào là người đầu tiên không (thiết lập độ dài sang một bên, vòng lặp while ít hơn chiều dài) và đó là một chút nhanh hơn, nhưng vẫn còn khoảng gấp đôi chậm.
Sửa 2: Cảm ơn tất cả mọi người nhận hồ sơ của bạn! Các dữ liệu tôi sẽ sử dụng nó trên được đảm bảo là ascii, vì vậy tôi nghĩ rằng tôi sẽ gắn bó với phương pháp đầu tiên trong thời gian này. Tôi sẽ ghi nhớ rằng toupper
là ngôn ngữ cụ thể khi nào/nếu tôi cần.
toupper là chậm hơn so với những gì bạn làm trong _Reg bởi vì nó không nhiều hơn bạn làm trong Reg? – Almo
Tại sao bạn cũng không thêm phép chuyển đổi chuẩn C++ tại chỗ, 'std :: transform (s.begin(), s.end(), s.begin(), (int (*) (int)) std :: toupper); '? (Bạn cần phải "#include', '' và ''.) –
Wow, đó là một ngụm. Ngoài sự tò mò, phần '(int (*) (int))' là gì? –