Tag: 性能

协程怎么比线程快?

我试图找到一种情况,将多线程更改为协程将加快处理受影响的代码部分。 据我发现,与线程相比,协程使用更少的CPU和堆空间,但我仍然无法找到协程比线程更快的情况。 虽然我知道,协程创建和上下文切换比使用线程的相应操作便宜得多,但是我在速度差异上没有察觉到结果(没有测量线程创建,两种情况都是完全相同的)。 那么,甚至有可能找到一个协程比线程更快执行的情况呢?

不同类型的属性设置器

考虑下面的例子,有可能有一个接受一个Int另一个接受Double x的setter? class Test(x: Float) { var x: Float = x get() { return field } set(value) { // 'value' is of type 'Float' field = value } } 原因:如果我想给x赋一个新的值,我总是必须在每个赋值后加上f后缀 var v = Test(12f) vx = 11 // error: 'The integer literal does not conform to the expected type Float' vx = 11.0 // error: […]

双Xeon工作站上的Android Studio

好奇如果有人在双Xeon机器上进行Android Studio开发。 我想知道如果额外的CPU提供了一个戏剧性或可见(50%或更多)的建设性能提高。

为什么不在init块编译中初始化变量接口属性的代码?

interface A { var a: Int } class AJunior : A { override var a: Int init { a = 3 } } 它不会编译,因为 财产必须被初始化或是抽象的 但它已经初始化了。 我知道我可以写: override var a: Int = 3 但是为什么第一个例子不能编译? 我的猜测是,这是一个错误或故意限制,以简化编译器的实现,但我不知道。

所有ViewHolders同时创建

我有RecyclerView <android.support.v4.widget.SwipeRefreshLayout android:id="@+id/swipe_task_list" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@id/toolbar"> <android.support.v4.widget.NestedScrollView android:id="@+id/scroll_task_list" android:layout_width="match_parent" android:layout_height="wrap_content" android:fillViewport="true"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:focusableInTouchMode="true" android:orientation="vertical"> <android.support.v7.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/rv_task_list" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/background_task_list" /> <android.support.v4.widget.Space android:layout_width="match_parent" android:layout_height="80dp" /> </LinearLayout> </android.support.v4.widget.NestedScrollView> </android.support.v4.widget.SwipeRefreshLayout> 初始化: rv_task_list.layoutManager = LinearLayoutManager(context) rv_task_list.layoutManager.setAutoMeasureEnabled(true) rv_task_list.isNestedScrollingEnabled = false rv_task_list.adapter = adapter 在适配器中设置数据: data.addAll(tasksToAdapter) notifyDataSetChanged() (UPD)适配器: class TaskAdapter(private val view: ITaskList) : RecyclerView.Adapter<RecyclerView.ViewHolder>() { val data: […]

为什么我的Android应用程序中的第一个计算速度很慢,而所有后续的计算都很快

我正在使用symja android库来为我正在构建的测验应用程序执行数学计算。 我所有的计算都是通过将一个字符串(如“1 + 3 +(4/2)”)传递给名为ExprEvaluator()的库中的一个类来执行的。 一个示例的用法是 ExprEvaluator().evaluate("1+3 + (4/2)") //Kotlin 当我运行我的测验应用程序并首次回答问题时,主UI线程将冻结,因为它执行计算,但所有后续计算将非常快。 下面,我列出了一系列我为了解决问题而尝试的策略。 注:我已经注入ExprEvaluator类与匕首,它作为一个单身存在 class ChallengeUtils { @Inject lateinit var exprEvaluator: ExprEvaluator … fun evaluate(expression: String?): IExpr? { try { return exprEvaluator.evaluate(expression) } catch (e: Exception) { throw (e) } } 策略1:将计算卸载到一个单独的线程结果:在初始计算时间没有什么差别,实际上导致更多的问题,因为我需要在主UI线程上的结果。 所有后续的计算都像往常一样快。 策略2:在我的SplashScreen活动上运行一个简单的初始计算。 结果:这是我找到的最好的解决方案,但唯一的缺点是我的启动画面太长。 一旦进入主应用程序,测验表现非常好。 策略3:在启动画面中运行一个新的线程活动结果:这解决了启动画面加载太长的问题,但如果我在主线程上回答一个问题,并在其他线程的初始计算完成之前检查它的正确性,UI线程冻结。 我注意到第一个评估调用总是很慢,不管我传入的字符串是什么,我可以通过“1”,评估大约需要4秒,而所有后续更复杂的评估最多需要几毫秒。 即使我使用ExprEvaluator类的新实例来进行每一个sincle计算,如下所示: fun evaluate(expression: String?): IExpr? { try […]

什么更有效率? 存储变量引用与不(Android中的上下文)

假设我们正处于一种方法的中间。 而且我有两种编程风格的选择。 选项A:每次需要访问资源时,使用getContext().getResources() public void doSomeStuffA(){ //… getContext().getResources().getDrawable(R.drawable.ic_launcher); getContext().getResources().getDrawable(R.drawable.ic_arrow); //… } 选项B :将getContext().getResources()在变量中。 public void doSomeStuffB(){ //… Resources r = getContext().getResources(); r.getDrawable(R.drawable.ic_launcher); r.getDrawable(R.drawable.ic_arrow); //… } 哪种风格更好?

如何在android的后台运行一段代码?

我试图做一个应用程序,从手机加载联系人列表,但这需要大量的时间根据联系人的数量。 我想在后台运行加载联系人列表,以便它不会减慢应用程序。 我正在使用下面的函数来加载联系人信息。 void loadContacts() { ContentResolver contentResolver=getContentResolver(); Cursor cursor=contentResolver.query(ContactsContract.Contacts.CONTENT_URI,null,null,null,null); if(cursor.getCount() > 0) { while (cursor.moveToNext()) { String id = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID)); String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); Bitmap photo = retrieveContactPhoto(id); int hasPhoneNumber = Integer.parseInt(cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))); String phoneNumber = null; if (hasPhoneNumber > 0) { Cursor cursor2 = contentResolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?", new String[]{id}, null); […]

findViewById()的更好的代码结构

我很好奇在android中使用代码 findViewById(R.id.view_id).setVisibility(View.GONE); 要么 findViewById(R.id.view_id).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { } }); 这是一个很好的结构,使用“findViewById”或添加任何视图上的任何监听器或应使用它 Button buttonA=(Button)findViewById(R.id.view_id); buttonA.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { } }); 提前致谢。

XML布局中的性能与代码中的布局?

在android中的代码与XML布局完成的布局之间有任何性能差异?