Volley 增加线程池大小 Android
Volley Increasing ThreadPool Size Android
我在下面有这段代码,它发出 300 个 http 请求,每个请求 returns 来自数据库的 10000 行。 10000 的总大小约为 0.4mb。所以 300*0.4 = 120mb.
问题:
- 在 Volley 中增加用于处理请求的线程池大小会如何影响应用程序的性能?我把它改成12,但是执行时间和数据大小和4一样。有什么不同吗?
- 当增加Volley线程数时,结果数据是否也会增加?如果有 1 个线程,则每次返回的最大数据将为 0.4mb。但如果我们有 4 个,则最大值为 1.6mb。
仿真器:4 核多线程
ExecutorService service = Executors.newFixedThreadPool(4);
RequestQueue queue;
AtomicInteger counter = new AtomicInteger(0);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
File cacheDir = new File(this.getCacheDir(), "Volley");
queue = new RequestQueue(new DiskBasedCache(cacheDir), new BasicNetwork(new HurlStack()), 4);
queue.start();
start();
}
public void start(){
String url ="...";
for(int i =0 ; i<300; i++) {
counter.incrementAndGet();
StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
method(response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.d("VolleyError", error.toString());
}
});
stringRequest.setTag("a");
queue.add(stringRequest);
}
}
public synchronized void decreased(){
if(counter.decrementAndGet()==0)
start();
}
public void method( String response){
Runnable task = new Runnable() {
@Override
public void run() {
List<Customer> customers= new ArrayList<>();
ObjectMapper objectMapper = new ObjectMapper();
TypeFactory typeFactory = objectMapper.getTypeFactory();
try {
customers= objectMapper.readValue(response, new TypeReference<List<Customer>>() {});
//Simulate database insertion delay
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
decreased();
} catch (IOException e1) {
e1.printStackTrace();
}
}
};
logHeap("");
service.execute(task);
}
关于问题一:
与 12 相比,大小为 4 的线程池会更好。
线程池大小应与可用处理器数量结合使用。
由于处理器数量有限,应用不应产生不必要的线程,因为这可能会导致性能问题。由于 android OS 必须在更多线程之间管理资源,这将导致每个线程的等待时间和实际时间增加。
理想情况下,假设您的线程没有锁定,这样它们就不会互相阻塞(彼此独立),并且您可以假设工作负载(处理)相同,那么事实证明,有一个池Runtime.getRuntime().availableProcessors() or availableProcessors() + 1
的大小给出了最好的结果。
请参阅 link Setting Ideal size of Thread Pool 了解更多信息。
关于问题2:如果我没有理解你的问题,返回的数据应该没有变化,因为线程池大小对网络负载没有影响,只有等待时间和实际时间会改变,当线程池大小值已更改。
我在下面有这段代码,它发出 300 个 http 请求,每个请求 returns 来自数据库的 10000 行。 10000 的总大小约为 0.4mb。所以 300*0.4 = 120mb.
问题:
- 在 Volley 中增加用于处理请求的线程池大小会如何影响应用程序的性能?我把它改成12,但是执行时间和数据大小和4一样。有什么不同吗?
- 当增加Volley线程数时,结果数据是否也会增加?如果有 1 个线程,则每次返回的最大数据将为 0.4mb。但如果我们有 4 个,则最大值为 1.6mb。
仿真器:4 核多线程
ExecutorService service = Executors.newFixedThreadPool(4);
RequestQueue queue;
AtomicInteger counter = new AtomicInteger(0);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
File cacheDir = new File(this.getCacheDir(), "Volley");
queue = new RequestQueue(new DiskBasedCache(cacheDir), new BasicNetwork(new HurlStack()), 4);
queue.start();
start();
}
public void start(){
String url ="...";
for(int i =0 ; i<300; i++) {
counter.incrementAndGet();
StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
method(response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.d("VolleyError", error.toString());
}
});
stringRequest.setTag("a");
queue.add(stringRequest);
}
}
public synchronized void decreased(){
if(counter.decrementAndGet()==0)
start();
}
public void method( String response){
Runnable task = new Runnable() {
@Override
public void run() {
List<Customer> customers= new ArrayList<>();
ObjectMapper objectMapper = new ObjectMapper();
TypeFactory typeFactory = objectMapper.getTypeFactory();
try {
customers= objectMapper.readValue(response, new TypeReference<List<Customer>>() {});
//Simulate database insertion delay
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
decreased();
} catch (IOException e1) {
e1.printStackTrace();
}
}
};
logHeap("");
service.execute(task);
}
关于问题一: 与 12 相比,大小为 4 的线程池会更好。 线程池大小应与可用处理器数量结合使用。
由于处理器数量有限,应用不应产生不必要的线程,因为这可能会导致性能问题。由于 android OS 必须在更多线程之间管理资源,这将导致每个线程的等待时间和实际时间增加。
理想情况下,假设您的线程没有锁定,这样它们就不会互相阻塞(彼此独立),并且您可以假设工作负载(处理)相同,那么事实证明,有一个池Runtime.getRuntime().availableProcessors() or availableProcessors() + 1
的大小给出了最好的结果。
请参阅 link Setting Ideal size of Thread Pool 了解更多信息。
关于问题2:如果我没有理解你的问题,返回的数据应该没有变化,因为线程池大小对网络负载没有影响,只有等待时间和实际时间会改变,当线程池大小值已更改。