Tải bản đầy đủ (.ppt) (67 trang)

Tối ưu hóa lập trình Java

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (2.3 MB, 67 trang )

Java’s Performance
Java’s Performance
Nội dung chính
Nội dung chính

Giới thiệu vấn đề
Giới thiệu vấn đề

Yêu cầu tối ưu hóa
Yêu cầu tối ưu hóa

Xử lý xâu kí tự
Xử lý xâu kí tự

Pure Overhead
Pure Overhead

Hiệu năng trong các lớp Collection
Hiệu năng trong các lớp Collection

Catching trong tối ưu hóa
Catching trong tối ưu hóa

Java I/O Stream
Java I/O Stream
Giới thiệu vấn đề
Giới thiệu vấn đề

Performance là một trong những tiêu chí đánh giá chất
Performance là một trong những tiêu chí đánh giá chất
lượng phần mềm


lượng phần mềm

Để khai thác Performance của một phần mềm, có hai
Để khai thác Performance của một phần mềm, có hai
khả năng :
khả năng :

Khi muốn nâng cao performance, có thể phải giảm đi, hay tác động đến
Khi muốn nâng cao performance, có thể phải giảm đi, hay tác động đến
những tiêu chí khác.
những tiêu chí khác.

Có thể tăng được performance mà không tác động đến những tiêu chí
Có thể tăng được performance mà không tác động đến những tiêu chí
khác. Và để làm được như vậy, bạn phải hiểu được, từng câu lệnh,
khác. Và để làm được như vậy, bạn phải hiểu được, từng câu lệnh,
từng khai báo sử dụng trong một
từng khai báo sử dụng trong một


chương trình.
chương trình.
Giới thiệu vấn đề
Giới thiệu vấn đề

Các yếu tố tác động đến Performance :
Các yếu tố tác động đến Performance :

Khả năng phần cứng
Khả năng phần cứng


Thực thi máy ảo
Thực thi máy ảo

Các tham số điều chỉnh hệ thống và JVM
Các tham số điều chỉnh hệ thống và JVM

Kiến trúc thiết kế ứng dụng*
Kiến trúc thiết kế ứng dụng*

JDK
JDK

Khả năng quản lý bộ nhớ
Khả năng quản lý bộ nhớ

Hiệu quả mã hóa *
Hiệu quả mã hóa *
Yêu cầu tối ưu hóa
Yêu cầu tối ưu hóa

Những yêu cầu trước khi tối ưu hóa
Những yêu cầu trước khi tối ưu hóa

Code optimize được xem là một quá trình biến đổi một source
Code optimize được xem là một quá trình biến đổi một source
code cũ sang một source code mới. Việc chuyển đổi này có
code cũ sang một source code mới. Việc chuyển đổi này có
những đặc tính:
những đặc tính:


Giữ được tính chính xác
Giữ được tính chính xác

Hiệu quả hơn cái code cũ
Hiệu quả hơn cái code cũ

Code optimize thường mất đi tính khái quái và kém khả năng sử
Code optimize thường mất đi tính khái quái và kém khả năng sử
dụng lại. Đơn giản là do nó
dụng lại. Đơn giản là do nó
thu hẹp phạm vi và tập trung vào vấn
thu hẹp phạm vi và tập trung vào vấn
đề cẩn phải giải quyết
đề cẩn phải giải quyết

Code mới thường phức tạp hơn code cũ. Nó có tính phức tạp, khó
Code mới thường phức tạp hơn code cũ. Nó có tính phức tạp, khó
hiểu, khó bảo trì,khó sửa đổi & mở rộng
hiểu, khó bảo trì,khó sửa đổi & mở rộng
Yêu cầu tối ưu hóa
Yêu cầu tối ưu hóa

Những yêu cầu trước khi tối ưu hóa
Những yêu cầu trước khi tối ưu hóa

Với những lý luận này, tối ưu hóa phần mềm là một công việc
Với những lý luận này, tối ưu hóa phần mềm là một công việc
tương đối rủi ro. Nó có thể tác động không tốt đến những tiêu
tương đối rủi ro. Nó có thể tác động không tốt đến những tiêu

chí khác quan trọng không kém của phần mềm. vì vậy, cần phải
chí khác quan trọng không kém của phần mềm. vì vậy, cần phải
có sự cân nhắc khi thực hiện:
có sự cân nhắc khi thực hiện:

Cần profile hóa đoạn mã cũ
Cần profile hóa đoạn mã cũ

Xem xét những yếu tố trả về khi thực hiện tối ưu
Xem xét những yếu tố trả về khi thực hiện tối ưu
.
.
Xử lý xâu kí tự
Xử lý xâu kí tự

Xử lý xâu chuỗi là một vấn đề thường xuyên gặp khi lập trình Java, đặc
Xử lý xâu chuỗi là một vấn đề thường xuyên gặp khi lập trình Java, đặc
biệt là trong các ứng dụng Web
biệt là trong các ứng dụng Web


( String, StringBuffer hay StringTokenizer ).
( String, StringBuffer hay StringTokenizer ).


Các vấn đề tối ưu trong xâu kí tự:
Các vấn đề tối ưu trong xâu kí tự:
1.
1.
Ghép nối xâu chuỗi

Ghép nối xâu chuỗi
2.
2.
Quản lý đối tượng
Quản lý đối tượng
3.
3.
So sánh chuỗi
So sánh chuỗi
4.
4.
Chuyển đỗi kí tự & byte
Chuyển đỗi kí tự & byte
5.
5.
charAt() & startWidth()
charAt() & startWidth()
6.
6.
StringBuffer’s Capacity
StringBuffer’s Capacity
Xử lý xâu kí tự
Xử lý xâu kí tự
1.
1.
Ghép nối xâu chuỗi
Ghép nối xâu chuỗi
ví dụ: String p = a+b; ( có bao nhiêu đối tượng được tạo ra ? )
ví dụ: String p = a+b; ( có bao nhiêu đối tượng được tạo ra ? )







String p = (new StringBuffer()).append(a).append(b).toString()
String p = (new StringBuffer()).append(a).append(b).toString()


String s = new String();
String s = new String();
// <+++ Start timing
// <+++ Start timing
long start = System.currentTimeMillis();
long start = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) {
for (int i = 0; i < 10000; i++) {
s += "a";
s += "a";
}
}
// <+++ Stop timing
// <+++ Stop timing
long stop = System.currentTimeMillis();
long stop = System.currentTimeMillis();
// Result : 2200 mili s
// Result : 2200 mili s
StringBuffer s = new StringBuffer();
StringBuffer s = new StringBuffer();
// <+++ Start timing

// <+++ Start timing
long start = System.currentTimeMillis();
long start = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) {
for (int i = 0; i < 10000; i++) {
s.append("a");
s.append("a");
}
}
// <+++ Stop timing
// <+++ Stop timing
long stop = System.currentTimeMillis();
long stop = System.currentTimeMillis();
// Result: 8 mili s
// Result: 8 mili s
Nhận xét : Sử dụng StringBuffer với các thao tác ghép nối, thay đổi giá trị xâu chuỗi.
Xử lý xâu kí tự
Xử lý xâu kí tự
2.
2.
Quản lý đối tượng
Quản lý đối tượng


printWriter.print(x+y);
printWriter.print(x+y);
printWriter.print(x);
printWriter.print(x);
printWriter.print(y);
printWriter.print(y);

Nhận xét : Cân nhắc các tác động đến hiệu năng do hiệu tạo ra đối tượng mới
Xử lý xâu kí tự
Xử lý xâu kí tự
3.
3.
So sánh chuỗi
So sánh chuỗi


Có hai phần: Case sessitive & non-senssitive
Có hai phần: Case sessitive & non-senssitive


1. equals()
1. equals()


2. equalsIgnoreCase()
2. equalsIgnoreCase()


// Compare two identical strings
// Compare two identical strings
public class Equals_1 {
public class Equals_1 {
public static void main(String args[]) {
public static void main(String args[]) {
String s = "H"+"elloWorld";
String s = "H"+"elloWorld";
String p = "HelloWorl"+"d";

String p = "HelloWorl"+"d";


// <+++ Start timing
// <+++ Start timing
long start =
long start =
System.currentTimeMillis();
System.currentTimeMillis();
for (int i = 0; i < 10000000; i++) {
for (int i = 0; i < 10000000; i++) {
s.equals(p);
s.equals(p);
}
}


// <+++ Stop timing
// <+++ Stop timing


long stop =
long stop =
System.currentTimeMillis();
System.currentTimeMillis();
System.out.println( " time = " + (stop -
System.out.println( " time = " + (stop -
start) );
start) );
}}

}}
// Compare two strings of same length but
// Compare two strings of same length but
different case
different case
public class Equals_2 {
public class Equals_2 {
public static void main(String args[]) {
public static void main(String args[]) {
String s = "HelloWorld";
String s = "HelloWorld";
String p = "HelloWorlD";
String p = "HelloWorlD";
// <+++ Start timing
// <+++ Start timing


long start = System.currentTimeMillis();
long start = System.currentTimeMillis();


for (int i = 0; i < 10000000; i++) {
for (int i = 0; i < 10000000; i++) {
s.equals(p);
s.equals(p);
}
}
// <+++ Stop timing
// <+++ Stop timing



long stop = System.currentTimeMillis();
long stop = System.currentTimeMillis();
}}
}}
Xử lý xâu kí tự
Xử lý xâu kí tự
3.
3.
So sánh chuỗi
So sánh chuỗi
// Compare two strings of different length
// Compare two strings of different length
public class Equals_3 {
public class Equals_3 {
public static void main(String args[]) {
public static void main(String args[]) {
String s = "HelloWorld";
String s = "HelloWorld";
String p = "HelloWorld1";
String p = "HelloWorld1";
// <+++ Start timing
// <+++ Start timing


long start = System.currentTimeMillis();
long start = System.currentTimeMillis();


for (int i = 0; i < 10000000; i++) {

for (int i = 0; i < 10000000; i++) {
s.equals(p);
s.equals(p);
}
}




// <+++ Stop timing
// <+++ Stop timing


long stop = System.currentTimeMillis();
long stop = System.currentTimeMillis();
}}
}}
Xử lý xâu kí tự
Xử lý xâu kí tự
4.
4.
Chuyển đổi Characters
Chuyển đổi Characters


Bytes
Bytes


public class StringGetBytes {

public class StringGetBytes {
public static void main(String args[]) {
public static void main(String args[]) {
String s = "HelloWorld";
String s = "HelloWorld";
// <+++ Start timing
// <+++ Start timing


long start = System.currentTimeMillis();
long start = System.currentTimeMillis();


for (int i = 0; i < 1000000; i++) {
for (int i = 0; i < 1000000; i++) {
byte[] b = s.getBytes();
byte[] b = s.getBytes();
}
}


// <+++ Stop timing
// <+++ Stop timing


long stop = System.currentTimeMillis();
long stop = System.currentTimeMillis();
}}
}}
//Result : 17.000 mili s

//Result : 17.000 mili s
public class MyGetBytes {
public class MyGetBytes {
public static byte[] asciiGetBytes(String buf) {
public static byte[] asciiGetBytes(String buf) {
int size = buf.length();
int size = buf.length();
int i;
int i;
byte[] bytebuf = new byte[size];
byte[] bytebuf = new byte[size];
for (i = 0; i < size; i++) {
for (i = 0; i < size; i++) {
bytebuf = (byte) buf.charAt(i);
bytebuf = (byte) buf.charAt(i);
}
}
return bytebuf;
return bytebuf;
}
}
public static void main(String args[]) {
public static void main(String args[]) {
String s = "HelloWorld";
String s = "HelloWorld";
long start = System.currentTimeMillis();
long start = System.currentTimeMillis();


for (int i = 0; i < 1000000; i++) {

for (int i = 0; i < 1000000; i++) {
byte[] b = asciiGetBytes(s);
byte[] b = asciiGetBytes(s);
}
}
long stop = System.currentTimeMillis();
long stop = System.currentTimeMillis();
System.out.println( " time = " + (stop - start) );
System.out.println( " time = " + (stop - start) );
}}
}}
// Result : 2.500 mili s
// Result : 2.500 mili s
Xử lý xâu kí tự
Xử lý xâu kí tự
4.
4.
Chuyển đổi Characters
Chuyển đổi Characters


Bytes
Bytes

Một giải pháp phần mềm mang tính khái quát có thể ảnh hưởng đến hiệu năng của hệ thống.
Một giải pháp phần mềm mang tính khái quát có thể ảnh hưởng đến hiệu năng của hệ thống.
Một điều cơ bản của tối ưu hóa là hãy thu hẹp phạm vi vấn đề giải quyết. Chính điều này mâu
Một điều cơ bản của tối ưu hóa là hãy thu hẹp phạm vi vấn đề giải quyết. Chính điều này mâu
thuẫn trưc tiếp với tính tái sử dụng trong thiết kế phần mềm theo hướng đối tượng
thuẫn trưc tiếp với tính tái sử dụng trong thiết kế phần mềm theo hướng đối tượng


Mỗi một kí tự Unicode có thể
Mỗi một kí tự Unicode có thể
chuyển thành 2,3 byte
chuyển thành 2,3 byte
. Tuy nhiên, nếu chỉ xem xét vấn đề
. Tuy nhiên, nếu chỉ xem xét vấn đề
giải quyết đối với những kí tự trong bảng mã ACSII - một tập hợp con nhỏ hơn của
giải quyết đối với những kí tự trong bảng mã ACSII - một tập hợp con nhỏ hơn của
Unicode…
Unicode…

Trong ASCII, mỗi một kí tự được chuyển đổi thành
Trong ASCII, mỗi một kí tự được chuyển đổi thành
một byte
một byte
, bởi việc cắt đi một trong số
, bởi việc cắt đi một trong số
hai byte biểu diễn theo Unicode.
hai byte biểu diễn theo Unicode.






Chính những thao tác chuyển đổi này sẽ ảnh hướng đến tính phức tạp + hiệu năng hệ
Chính những thao tác chuyển đổi này sẽ ảnh hướng đến tính phức tạp + hiệu năng hệ
thống nếu chúng ta chỉ cần sử dụng đến những kí tự trong bảng mã ACSII.
thống nếu chúng ta chỉ cần sử dụng đến những kí tự trong bảng mã ACSII.

Nhận xét :
Nhận xét :


Muốn tăng hiệu năng, hãy thu hẹp phạm vi xử lý và chỉ tập trung vào vấn đề
Muốn tăng hiệu năng, hãy thu hẹp phạm vi xử lý và chỉ tập trung vào vấn đề
cần phải giải quyết
cần phải giải quyết




Hạn chế các thao tác dư thừa.
Hạn chế các thao tác dư thừa.
Ví dụ: charAt()
Ví dụ: charAt()
Xử lý xâu kí tự
Xử lý xâu kí tự
5.
5.
charAt() & startsWith()
charAt() & startsWith()
public static byte[] asciiGetBytes(String
public static byte[] asciiGetBytes(String
buf) {
buf) {
int size = buf.length();
int size = buf.length();
int i;
int i;

byte[] bytebuf = new byte[size];
byte[] bytebuf = new byte[size];
for (i = 0; i < size; i++) {
for (i = 0; i < size; i++) {
bytebuf = (byte)buf.charAt(i);
bytebuf = (byte)buf.charAt(i);
}
}
return bytebuf;
return bytebuf;
}
}
public char fastCharAt(int index) {
public char fastCharAt(int index) {
return value[index + offset];
return value[index + offset];


// Offset is the point in the
// Offset is the point in the
// buffer where this
// buffer where this
// String begins.
// String begins.
// It could be substring of a
// It could be substring of a
// larger String
// larger String
}
}

if (s.startsWith("a")) { }
if (s.startsWith("a")) { }
if ('a' == s.charAt(0)) { }
if ('a' == s.charAt(0)) { }
Xử lý xâu kí tự
Xử lý xâu kí tự
6.
6.
StringBuffer’s Capacity
StringBuffer’s Capacity
Để định nghĩa một đối tượng StringBuffer chúng ta có hai cách:
Để định nghĩa một đối tượng StringBuffer chúng ta có hai cách:
StringBuffer sb = new StringBuffer();
StringBuffer sb = new StringBuffer();
StringBuffer sb = new StringBuffer(XX);
StringBuffer sb = new StringBuffer(XX);



Khởi tạo với kích thước mặc định 16
Khởi tạo với kích thước mặc định 16



Khi kích thước sử dụng > 16,
Khi kích thước sử dụng > 16,
StringBuffer thực hiện
StringBuffer thực hiện



+ Tạo ra một mảng kí tự mới ( gấp 2
+ Tạo ra một mảng kí tự mới ( gấp 2
so với kích thước cũ )
so với kích thước cũ )


+ Copy từ mảng kí tự cũ sang mảng
+ Copy từ mảng kí tự cũ sang mảng
mới,
mới,
Dự tính khả năng sử dụng, chọn một
Dự tính khả năng sử dụng, chọn một
giá trị khởi đầu tránh cho việc phải thay
giá trị khởi đầu tránh cho việc phải thay
đổi kích thước StringBuffer trong quá
đổi kích thước StringBuffer trong quá
trình sử dụng
trình sử dụng
Pure Overhead
Pure Overhead
Giới thiệu vấn đề:
Giới thiệu vấn đề:
Việc tối ưu hóa đỏi hỏi phải cân bằng được các yếu tố có khả năng xung đột lẫn
Việc tối ưu hóa đỏi hỏi phải cân bằng được các yếu tố có khả năng xung đột lẫn
nhau trong một phần mềm (tính mềm dẻo, khả năng bảo trì, giá cả, khả năng tái sử
nhau trong một phần mềm (tính mềm dẻo, khả năng bảo trì, giá cả, khả năng tái sử
dụng ).Tuy nhiên vẫn có những trường hợp tối ưu mà không làm ảnh hưởng đến
dụng ).Tuy nhiên vẫn có những trường hợp tối ưu mà không làm ảnh hưởng đến
những tiêu chí khác ( pure overhead )
những tiêu chí khác ( pure overhead )

Pure Overhead
Pure Overhead
1.
1.
Những tính toán dư thừa:
Những tính toán dư thừa:
public class Trace {
public class Trace {
private static boolean loggingIsOn = false;
private static boolean loggingIsOn = false;
public static void log (String msg) {
public static void log (String msg) {
if (loggingIsOn == true) System.out.println(msg); }
if (loggingIsOn == true) System.out.println(msg); }
public static void setLoggingIsOn(boolean newState) {
public static void setLoggingIsOn(boolean newState) {
loggingIsOn = newState; }
loggingIsOn = newState; }
public static boolean logging() {
public static boolean logging() {
return loggingIsOn;
return loggingIsOn;
} }
} }
Lớp Tracing gồm một biến private static : loggingIsOn giám sát trạng thái của
Lớp Tracing gồm một biến private static : loggingIsOn giám sát trạng thái của
ứng dụng bằng cách in ra thông báo msg khi có giá trị bằng true. Ví dụ Tracing một
ứng dụng bằng cách in ra thông báo msg khi có giá trị bằng true. Ví dụ Tracing một
biến nguyên i:
biến nguyên i:

public void doIntTrace(int i) {
public void doIntTrace(int i) {
Trace.log("Enter doIntTrace(). Input arg is " + i);
Trace.log("Enter doIntTrace(). Input arg is " + i);
myInt = i+1;
myInt = i+1;
Trace.log("Exit doIntTrace()"); }
Trace.log("Exit doIntTrace()"); }
Pure Overhead
Pure Overhead
1.
1.
Những tính toán dư thừa
Những tính toán dư thừa
public void doInt(int i) {
public void doInt(int i) {
myInt = i+1;
myInt = i+1;
}
}
public void doIntTrace(int i) {
public void doIntTrace(int i) {
Trace.log("Enter doIntTrace(). Input
Trace.log("Enter doIntTrace(). Input
arg is " + i);
arg is " + i);
myInt = i+1;
myInt = i+1;
Trace.log("Exit doIntTrace()");
Trace.log("Exit doIntTrace()");

}
}
for (int i = 0; i < 1000000; i++) {
for (int i = 0; i < 1000000; i++) {
doInt(i);
doInt(i);
}
}
// result : 250 mili s
// result : 250 mili s
for (int i = 0; i < 1000000; i++) {
for (int i = 0; i < 1000000; i++) {
doIntTrace(i);
doIntTrace(i);
}
}
// result : 10.400 mili s
// result : 10.400 mili s

Nguyên nhân : cho dù Tracing ở trạng thái "on" hay "off" (biến loggingIsOn có giá trị
true hay false) thì mỗi lần gọi Trace.log(), một đối tượng String mới lại được tạo ra
làm tham số đầu vào lời gọi, cho dù chúng có được in ra hay không
Pure Overhead
Pure Overhead
1.
1.
Những tính toán dư thừa
Những tính toán dư thừa
Hướng giải quyết: Kiểm tra giá trị biến trước khi thực hiện truyền tham số:
Hướng giải quyết: Kiểm tra giá trị biến trước khi thực hiện truyền tham số:

public void doIntTrace2(int i) {
public void doIntTrace2(int i) {
if (Trace.logging()) Trace.log("Enter doIntTrace2(). Input arg is " + i);
if (Trace.logging()) Trace.log("Enter doIntTrace2(). Input arg is " + i);
myInt = i+1;
myInt = i+1;
if (Trace.logging()) Trace.log("Exit doIntTrace2()");
if (Trace.logging()) Trace.log("Exit doIntTrace2()");
}
}
Pure Overhead
Pure Overhead
2.
2.
Tránh dư thừa trong việc tạo đối tượng
Tránh dư thừa trong việc tạo đối tượng
void f() {
void f() {
int i;
int i;
Date x = new Date();
Date x = new Date();


// Date x is constructed
// Date x is constructed
outside.
outside.
// the scope where it is used
// the scope where it is used

if ( ) {
if ( ) {
// Date object x only used here
// Date object x only used here
}
}


}
}
void f() {
void f() {
int i;
int i;


if ( ) {
if ( ) {
Date x = new Date();
Date x = new Date();


// Date x is constructed inside the
// Date x is constructed inside the
// .scope where it is used
// .scope where it is used
// Date object x only used here
// Date object x only used here
}
}

}
}
Nếu điều kiện if là false thì việc tạo ra
Nếu điều kiện if là false thì việc tạo ra
biến x là dư thừa:
biến x là dư thừa:
- Cấp phát đối tượng mới
- Cấp phát đối tượng mới
- Thực thi khởi tạo giá trị cho đối tượng
- Thực thi khởi tạo giá trị cho đối tượng
- Thu dọn khi đối tượng không còn sử
- Thu dọn khi đối tượng không còn sử
dụng
dụng
Pure Overhead
Pure Overhead
3.
3.
Nguyên tắc 80-20
Nguyên tắc 80-20
Nguyên tắc 80-20 chỉ ra rằng : 20% thời giạn bạn code đã tạo ra những dòng lệnh
Nguyên tắc 80-20 chỉ ra rằng : 20% thời giạn bạn code đã tạo ra những dòng lệnh
mới và 80% thời gian để fix những bug trong một phần mềm, 80% thời gian thực thi
mới và 80% thời gian để fix những bug trong một phần mềm, 80% thời gian thực thi
của một phần mềm bị chiếm bởi thời gian thực thi của 20% dòng lệnh nào đó. Vấn
của một phần mềm bị chiếm bởi thời gian thực thi của 20% dòng lệnh nào đó. Vấn
đề là làm sao để có thể tìm ra được phần 20% đó, và giải quyết vấn đề đó cho thật
đề là làm sao để có thể tìm ra được phần 20% đó, và giải quyết vấn đề đó cho thật
tốt
tốt

Ví dụ:
Ví dụ:


Một đặc tả HTTP mô tả những HTTP request có thể có mà một Web server cần
Một đặc tả HTTP mô tả những HTTP request có thể có mà một Web server cần
phải xử lý. Các HTTP request này không phải là ngẫu nhiên , nói cách khác đa số
phải xử lý. Các HTTP request này không phải là ngẫu nhiên , nói cách khác đa số
chúng đều có những điểm chung nhất định.
chúng đều có những điểm chung nhất định.


Nếu như ban biết rằng, đa số các trình duyệt mà client sử dụng đều chỉ tập trung
Nếu như ban biết rằng, đa số các trình duyệt mà client sử dụng đều chỉ tập trung
trên môt số loại như I.E , Mozzila thì chúng ta có thể tập trung vào việc xử lý những
trên môt số loại như I.E , Mozzila thì chúng ta có thể tập trung vào việc xử lý những
request đến từ các loại trình duyệt này, trước khi đưa ra những xử lý chung cho tất
request đến từ các loại trình duyệt này, trước khi đưa ra những xử lý chung cho tất
cả các loại trình duyệt khác nhau.
cả các loại trình duyệt khác nhau.
Pure Overhead
Pure Overhead
3.
3.
Nguyên tắc 80-20
Nguyên tắc 80-20
Trong HTTP request, trường HTTP Accept header xác định những định dạng nội
Trong HTTP request, trường HTTP Accept header xác định những định dạng nội
dung mà trình duyệt có thể xử lý được. Trong đặc tả HTTP, nó cho phép "Accept“
dung mà trình duyệt có thể xử lý được. Trong đặc tả HTTP, nó cho phép "Accept“

header có thể sử dụng cả chữ in hoa hoặc chữ in thường, vì vậy, khi xử lý chuỗi kí
header có thể sử dụng cả chữ in hoa hoặc chữ in thường, vì vậy, khi xử lý chuỗi kí
tự "Accept", chúng ta phải viết :
tự "Accept", chúng ta phải viết :
if (headerName.equalsIgnoreCase("Accept:")) {
if (headerName.equalsIgnoreCase("Accept:")) {
// This is the Accept header
// This is the Accept header
}
}
Tuy nhiên, so sánh như vậy sẽ ảnh hưởng đến hiệu năng. Tại sao chúng ta không
Tuy nhiên, so sánh như vậy sẽ ảnh hưởng đến hiệu năng. Tại sao chúng ta không
nghĩ đến một giải pháp tối ưu hơn : tập trung xử lý trước tiên đối với những "Accept
nghĩ đến một giải pháp tối ưu hơn : tập trung xử lý trước tiên đối với những "Accept
:" của I.E, hay Mozzila, trước khi đưa ra một xử lý chung, theo đúng đặc tả .
:" của I.E, hay Mozzila, trước khi đưa ra một xử lý chung, theo đúng đặc tả .
if (headerName.equals("Accept:") || headerName.equalsIgnoreCase("Accept:"))
if (headerName.equals("Accept:") || headerName.equalsIgnoreCase("Accept:"))
{
{
// This is the Accept header. Do something with it.
// This is the Accept header. Do something with it.
}
}
Vector & Hashtable
Vector & Hashtable
Các vấn đề:
Các vấn đề:

Vector Add & Remove


Vector’s Capacity

Vector Enumeration

Xây dựng lớp Vector hiệu quả

Phương pháp sử dụng hàm API

Các tham số của Hashtable

Nâng cao tốc độ hashCode() & equals()
Vector & Hashtable
Vector & Hashtable
1.
1.
Vector Add & Remove
Vector Add & Remove


Đối tượng Vector cung cấp cho chúng ta rất nhiều cách để bổ sung thêm một phần
Đối tượng Vector cung cấp cho chúng ta rất nhiều cách để bổ sung thêm một phần
tử vào tập hợp :
tử vào tập hợp :

insertElementAt(e, index)
insertElementAt(e, index)

addElement(e)
addElement(e)


add(e)
add(e)

add(index,e)
add(index,e)
Đánh giá hiệu năng giữa các phương thức
Đánh giá hiệu năng giữa các phương thức
Phương thức addElement() có tốc độ thực thi nhanh hơn add(), do nó trả về
Phương thức addElement() có tốc độ thực thi nhanh hơn add(), do nó trả về
giá trị void, trong khi add() trả về một giá trị boolean
giá trị void, trong khi add() trả về một giá trị boolean
Vector & Hashtable
Vector & Hashtable
2.
2.
Vector’s Capacity
Vector’s Capacity


Khái niệm Vector’s Capacity giống như trong StringBuffer
Khái niệm Vector’s Capacity giống như trong StringBuffer


Quá trình mở rộng của Vector, đòi hỏi bộ nhớ phải cấp phát một mảng mới, và copy
Quá trình mở rộng của Vector, đòi hỏi bộ nhớ phải cấp phát một mảng mới, và copy
dữ liệu từ mảng cũ sang mảng mới, xóa mảng cũ đi. Chính vì thế, nó cũng sẽ tác
dữ liệu từ mảng cũ sang mảng mới, xóa mảng cũ đi. Chính vì thế, nó cũng sẽ tác
động tương đối đến hiệu quả thực thi của phần mềm
động tương đối đến hiệu quả thực thi của phần mềm


Giải quyết: thay thế khởi tạo mặc định
Giải quyết: thay thế khởi tạo mặc định
Vector v = new Vector()
Vector v = new Vector()
bằng Vector v = new Vector(x),với x là một giá trị ước lượng
bằng Vector v = new Vector(x),với x là một giá trị ước lượng
Ngoài ra, còn một tham số nữa có thể sử dụng là mức độ gia tăng phần tử trong quá
Ngoài ra, còn một tham số nữa có thể sử dụng là mức độ gia tăng phần tử trong quá
trình mở rộng, với mục đích ở đây là giảm thiểu hóa việc tác động hiệu năng khi
trình mở rộng, với mục đích ở đây là giảm thiểu hóa việc tác động hiệu năng khi
Vector bắt buộc phải mở rộng.
Vector bắt buộc phải mở rộng.
Ví dụ: Vector v = new Vector(100,25);
Ví dụ: Vector v = new Vector(100,25);

Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×