2010-10-28 40 views
10

Trước đây, khi lần đầu tiên tôi thiết kế phần mềm liên quan đến ứng dụng chứng khoán, tôi quyết định sử dụng java.util.Date để trình bày thông tin ngày/giờ của một cổ phiếu.Di chuyển từ Lịch Java sang Ngày Joda

Sau đó, tôi nhận thấy hầu hết các phương pháp trong số java.util.Date không còn được dùng nữa. Do đó, rất sớm, tôi refactor tất cả các mã của tôi để sử dụng java.util.Calendar

Tuy nhiên, có 2 thiếu sót mà tôi gặp phải.

  1. Construct java.util.Calendar là so sánh chậm hơn so với java.util.Date
  2. Trong accessors getCalendar phương pháp Stock lớp, tôi cần phải sao chép một bản sao, như Calendar là một lớp học có thể thay đổi

Dưới đây là mã nguồn hiện tại cho Stock.java

Gần đây, tôi khám phá Joda-Time. Tôi làm điểm chuẩn sau đây, bằng cách tạo 1.000.000 java.util.Date, java.util.Calendarorg.joda.time.DateTime. Tôi đã tìm thấy org.joda.time.DateTime hoạt động tốt hơn java.util.Calendar, trong quá trình khởi tạo.

Đây là kết quả điểm chuẩn alt text.

Tốc độ khởi tạo này là quan trọng, đặc biệt là nhiều phiên bản Cổ phiếu sẽ được tạo, để biểu thị lịch sử giá dài của một cổ phiếu.

Bạn có nghĩ là cần di chuyển từ Lịch Java sang Thời gian ngày Joda, để đạt được hiệu suất tốc độ ứng dụng không? Có bẫy nào tôi cần chú ý không?

Trả lời

11

Lưu ý rằng java.util.Date là có thể thay đổi quá - vì vậy nếu đó là một vấn đề bây giờ bạn đang sử dụng Calendar, nó đã có một vấn đề sử dụng Date quá. Điều đó nói rằng, bằng cách sử dụng Joda Thời gian là chắc chắn có giá trị chỉ vì nó là một API tốt hơn nhiều.

Bạn chắc chắn rằng hiệu suất là thực sự là có vấn đề trong ứng dụng cụ thể của bạn không? Bạn nói sẽ có "nhiều trường hợp" của Stock được tạo ... bao nhiêu? Bạn đã lược tả nó chưa? Tôi sẽ không mong đợi nó thực sự tạo ra một sự khác biệt đáng kể trong hầu hết các tình huống. Nó không rõ ràng từ đồ thị điểm chuẩn của bạn những gì bạn đang thực sự đo lường.

Di chuyển đến thời gian Joda là một ý tưởng hay nói chung, nhưng tôi sẽ đo hiệu suất để xem mức độ khác biệt của nó là thực sự là phù hợp với bạn.

+1

+1 @Yan Cheng: Cũng lưu ý rằng tính bất biến của cấu trúc Joda Thời gian của có thể giúp bạn với hiệu suất kể từ khi bạn có thể đưa ra các tham chiếu đến các đối tượng không thay đổi một cách tự do mà không lo lắng về khả năng của khách hàng đột biến chúng. Ví dụ, khi phương thức 'getCalendar()' của bạn trong 'Stock' nhân bản' Calendar', bạn có thể trả về trực tiếp đối tượng Joda Time. – ColinD

1

Tôi đã sử dụng Joda trong quá khứ và đây là một thư viện tuyệt vời.

Xét về hiệu suất, bạn sẽ phải thử nghiệm nó, thật không may. Nhưng việc tái cấu trúc mã của bạn có vẻ quá nhiều. Cá nhân, tôi đã sử dụng Date trong toàn bộ ứng dụng của mình (bao gồm cả lưu trữ và truy xuất DB) và chỉ sử dụng Joda khi tôi cần thao tác dữ liệu. Joda chỉ tính toán các trường khi cần thiết, vì vậy tôi đoán chi phí sẽ thấp hơn nhiều so với việc sử dụng các lớp Java API; Hơn nữa, bạn sẽ không có vấn đề phiên bản đối tượng để chuyển và xử lý các đối tượng Date trong DB của bạn, các đối tượng tuần tự hóa và như vậy. Tôi không mong đợi Joda phá vỡ khả năng tương thích như vậy, nhưng nó ít có khả năng sử dụng Date.

0

Tốt hơn hết là nên chuyển sang thời gian joda nói chung. Nhưng nó thực sự là giá trị để di chuyển đến thời gian joda cho dự án của bạn dựa trên các trường hợp sử dụng của bạn liên quan đến việc sử dụng ngày tháng. Xem số trang trình bày 46 trong bản trình bày về các con số liên quan đến hiệu suất đối với một số hoạt động link text

+2

Liên kết đó đã chết; bạn có thể thêm hoặc tóm tắt nội dung nội tuyến không? – ataylor

2

Tại sao bạn cần một số Calendar trong lớp Stock? Tôi nghĩ rằng việc sử dụng một số Date để thể hiện một thời điểm là tốt. Điều này có vẻ là những gì bạn muốn, bởi vì bạn muốn đối tượng Calendar trong một cổ phiếu là không thay đổi, mà lớp Date sẽ là, nếu bạn bỏ qua các phương pháp không được chấp nhận.

Bạn có thể sử dụng tạm thời Calendar khi bạn cần phải làm các hoạt động thời gian trên một Date bên ngoài lớp Stock:

Calendar calendar = Calendar.getInstance(); 
calendar.setTime(stock.getDate()); 
System.out.println(calendar.getYear()); 

Như thế này bạn vẫn có thể lưu trữ một Date trong lớp Stock của bạn, mà cần phải có sản phẩm tốt nhất hiệu suất khi chỉ lưu trữ và truy xuất Stock các đối tượng từ bộ nhớ dữ liệu. Nếu bạn thực hiện nhiều thao tác cùng một lúc, bạn cũng có thể sử dụng lại cùng một đối tượng Calendar.

Nếu bạn không thích giao diện Calendar, bạn vẫn có thể sử dụng Thời gian Joda để thực hiện các thao tác thời gian. Bạn có thể chuyển đổi ngày đến và từ Joda Time nếu cần, để thực hiện các hoạt động thời gian và vẫn lưu trữ các đối tượng Date trong lớp Stock của bạn.

+0

-1 lớp chứng khoán nên không thay đổi. Hoạt động liên quan đến ngày tháng sẽ rất bất tiện. Hãy tưởng tượng bạn phải getInstance và setTime mọi lúc, tất cả trên toàn bộ mã của bạn. –

+0

Thao tác đơn giản như getYear, getMonth từ Ngày đã không được chấp nhận. Nếu tôi lưu trữ dưới dạng Date, để thực hiện thao tác đơn giản như vậy, tôi phải sử dụng tạo một Lịch khác từ Date và getYear, getMonth từ Calendar. –

+0

Tôi không thấy lý do tại sao bạn không thể sử dụng Lịch tạm thời cho nó, ngoại trừ việc bạn lười. Các lớp Java như SimpleDateFormat cũng sử dụng Lịch trong nội bộ để lấy các giá trị mà chúng phải thay thế trong mẫu Ngày tháng. Nếu tạo đối tượng Lịch mới chậm, bạn luôn có thể sử dụng lại Lịch. Các hoạt động trong lớp Date được khấu hao vì chúng không tính đến múi giờ. – Reboot

2

Nếu java.util.Calendar trường hợp cần thay thế bằng org.joda.time.DateTimeđược phân tích cú pháp và/hoặc được định dạng theo mẫu cụ thể, ví dụ:

String format = "YYYY-MM-dd HH:mm:ss"; 
  1. Trong chữ ký phương pháp tham số và kiểu trả về, cũng như khai báo biến

và các khởi tạo, repace toàn bộ từ lần xuất hiện của tên lớp Calendar (với

DateTime) và SimpleDateFormat (với DateTimeFormatter), tương ứng

  1. Thay thế câu lệnh khởi tạo trình định dạng, ví dụ:

    formatter = new SimpleDateFormat(format); 
    

    với

    formatter = DateTimeFormat.forPattern(format); 
    
  2. Thay thế các cuộc gọi đến các phương pháp của `SimpleDateFormat', ví dụ

    String dateStr = formatter.format(Calendar.getInstance().getTime()); 
    

    với

    String dateStr = DateTime.now().toString(formatter); 
    

    formatter.parse(dateStr); 
    

    với

    DateTime.parse(dateStr, formatter); 
    
Các vấn đề liên quan