Java 性能关键的ArrayList迭代(ioshed示例)

Java 性能关键的ArrayList迭代(ioshed示例),java,android,performance,arraylist,Java,Android,Performance,Arraylist,那么就是说, 这样,默认情况下应该使用增强的for循环,但是考虑 性能关键型ArrayList的手写计数循环 迭代 但看看应用程序,它被认为是大多数开发人员的一个示例,特别是在ScheduleUpdaterService.java中,我可以看到以下内容: void processPendingScheduleUpdates() { try { // Operate on a local copy of the schedule update list so

那么就是说,

这样,默认情况下应该使用增强的for循环,但是考虑 性能关键型ArrayList的手写计数循环 迭代

但看看应用程序,它被认为是大多数开发人员的一个示例,特别是在
ScheduleUpdaterService.java
中,我可以看到以下内容:

void processPendingScheduleUpdates() {
        try {
            // Operate on a local copy of the schedule update list so as not to block
            // the main thread adding to this list
            List<Intent> scheduleUpdates = new ArrayList<Intent>();
            synchronized (mScheduleUpdates) {
                scheduleUpdates.addAll(mScheduleUpdates);
                mScheduleUpdates.clear();
            }

            SyncHelper syncHelper = new SyncHelper(this);
            for (Intent updateIntent : scheduleUpdates) {
                String sessionId = updateIntent.getStringExtra(EXTRA_SESSION_ID);
                boolean inSchedule = updateIntent.getBooleanExtra(EXTRA_IN_SCHEDULE, false);
                LOGI(TAG, "addOrRemoveSessionFromSchedule:"
                        + " sessionId=" + sessionId
                        + " inSchedule=" + inSchedule);
                syncHelper.addOrRemoveSessionFromSchedule(this, sessionId, inSchedule);
            }
        } catch (IOException e) {
            // TODO: do something useful here, like revert the changes locally in the
            // content provider to maintain client/server sync
            LOGE(TAG, "Error processing schedule update", e);
        }
    }
void processPendingScheduleUpdates(){
试一试{
//在计划更新列表的本地副本上操作,以避免阻塞
//添加到此列表的主线程
List scheduleUpdates=新建ArrayList();
已同步(mScheduleUpdates){
scheduleUpdates.addAll(mScheduleUpdates);
mScheduleUpdates.clear();
}
SyncHelper SyncHelper=新的SyncHelper(此);
for(意图更新内容:scheduleUpdates){
String sessionId=updateIntent.getStringExtra(额外会话ID);
boolean inSchedule=updateIntent.getBooleanExtra(调度中的额外调度,false);
LOGI(标记“addOrRemoveSessionFromSchedule:”
+“sessionId=“+sessionId
+“inSchedule=“+inSchedule”);
syncHelper.addOrRemoveSessionFromSchedule(this,sessionId,inSchedule);
}
}捕获(IOE异常){
//TODO:在这里做一些有用的事情,比如在
//用于维护客户端/服务器同步的内容提供商
LOGE(标签“错误处理计划更新”,e);
}
}
请注意,通过
scheduleUpdates
有一个增强的for循环迭代,但建议避免对
ArrayList
进行此类迭代


这是因为从性能的角度来看,应用程序的这一部分不被认为是关键的,还是我不理解某些东西?非常感谢。

您需要查看代码的上下文。若您已经将所有对象创建都调整到了循环之外,并且大量使用了它,那个么切换到索引循环可能会有所不同


在您的情况下,创建日志字符串的操作显然要昂贵得多。对这一点进行优化将产生非常大的不同。(可能是10-1000倍以上)

您需要查看代码的上下文。若您已经将所有对象创建都调整到了循环之外,并且大量使用了它,那个么切换到索引循环可能会有所不同


在您的情况下,创建日志字符串的操作显然要昂贵得多。对这一点进行优化将产生非常大的不同。(可能是10-1000倍以上)

是的,迭代器会有一点性能损失。使用此迭代器的常规for循环也会遇到这种损失,而手动迭代会稍微快一些。然而,这是非常小的(如图所示,在纳秒量级上),可以忽略不计


应该在其他地方进行优化,例如限制对象的创建和销毁,和/或其他昂贵的操作。

是的,迭代器会造成少量性能损失。使用此迭代器的常规for循环也会遇到这种损失,而手动迭代会稍微快一些。然而,这是非常小的(如图所示,在纳秒量级上),可以忽略不计


应该在其他地方进行优化,例如限制对象创建和销毁,和/或其他昂贵的操作。

是。在99.999%的情况下,可读性和可维护性比性能更重要。性能提示说:“默认情况下,应该使用增强的for循环”


因此,除非您存在性能问题,并且证明了将foreach循环转换为计数循环可以解决此性能问题,或者至少可以显著改善这种情况,否则您应该支持可读性和可维护性,从而支持foreach循环。

是的。在99.999%的情况下,可读性和可维护性比性能更重要。性能提示说:“默认情况下,应该使用增强的for循环”

因此,除非您存在性能问题,并且证明了将foreach循环转换为计数循环可以解决此性能问题,或者至少可以显著改善这种情况,否则您应该支持可读性和可维护性,从而支持foreach循环