提高代码的运行速度
执行效率优化技术:提升程序运行速度与响应时间

执行效率优化技术:提升程序运行速度与响应时间引言在当今数字时代,快速的程序运行和响应时间对于软件和应用程序的用户体验至关重要。
无论是在电子商务、金融、游戏还是其他领域,用户对于快速的反馈和流畅的操作已经成为常态。
因此,对于开发人员来说,优化代码的执行效率是至关重要的任务。
本文将介绍一些常用的执行效率优化技术,以帮助开发人员提升程序的运行速度和响应时间。
1. 选择合适的算法和数据结构算法和数据结构是程序效率的基础。
选择合适的算法和数据结构可以大大减少程序的执行时间。
开发人员应该根据具体的应用需求和数据规模选择最适合的算法和数据结构。
例如,如果需要频繁搜索和插入操作的情况下,使用散列表(hash table)可能比使用数组更高效。
2. 优化循环和迭代循环和迭代是程序中最常见的操作之一。
优化循环和迭代过程可以显著提高程序的执行效率。
以下是一些优化循环和迭代的技巧:a) 减少循环次数尽量减少循环的次数,可以通过以下几种方式实现: - 使用更有效的循环条件- 使用合适的数据结构和算法 - 避免不必要的重复计算b) 局部变量优化在循环和迭代过程中,避免在循环体内频繁声明和初始化变量。
将局部变量的声明和初始化放在循环体外部,可以减少不必要的开销。
c) 循环展开循环展开是一种将循环展开为多个重复的操作的技术。
这样可以减少循环次数,从而提高程序的执行效率。
然而,循环展开的效果取决于具体的应用场景和硬件环境。
开发人员应根据实际情况进行权衡和测试。
3. 缓存优化缓存是用于存储频繁访问数据的高速存储器。
合理利用缓存可以减少访问主存的次数,从而提高程序的执行效率。
以下是一些缓存优化的技巧:a) 数据局部性数据局部性是指程序中访问数据的特点。
根据数据的访问模式,可以将频繁访问的数据放在缓存中,从而减少访问主存的次数。
例如,使用局部变量来存储频繁访问的数据,可以有效地利用缓存。
b) 数据对齐对齐数据可以使缓存访问更加高效。
在一些体系结构中,访问未对齐的数据需要额外的开销。
优化代码运行速度的方法与技巧

优化代码运行速度的方法与技巧优化代码运行速度是提高程序性能的重要任务之一。
下面是一些可以帮助你提升代码性能的方法和技巧。
1.选择合适的数据结构:不同的数据结构在不同的操作和查询方面有不同的效率。
选择最适合你的需求的数据结构,可以显著提高代码的性能。
2.使用更高效的算法:选择更高效的算法可以使代码更加快速和高效。
例如,排序算法的选择对性能有很大的影响。
3.减少循环次数:避免不必要的循环嵌套和重复计算。
尽量以最少的循环次数完成任务。
4.避免不必要的函数调用:函数调用时会有一定的开销。
如果可以避免不必要的函数调用,可以提高代码性能。
5.使用位运算代替乘除法运算:乘除法运算通常比位运算慢。
在合适的场景下,可以使用位运算代替乘除法运算,提高代码性能。
6.使用缓存进行优化:利用缓存机制,将频繁使用的数据存储在缓存中,减少访问内存的开销,提高代码性能。
7.避免过多的内存分配和释放:频繁的内存分配和释放会影响代码的性能。
尽量减少内存分配和释放的次数,可以使用对象池或者复用对象的方式来减少内存的开销。
8.使用并行计算:利用多线程或者并行计算框架,将计算任务分解成多个子任务并行执行,提高代码的运行速度。
9.减少磁盘和网络I/O操作:磁盘和网络I/O操作通常是程序性能的瓶颈之一。
减少对磁盘和网络的读写操作,可以提高代码的性能。
10.使用编译器优化选项:不同的编译器有不同的优化选项,可以根据编译器的不同选择合适的优化选项,提高代码的性能。
11.减少异常的使用:异常处理会有一定的开销。
在合适的场景下,可以减少异常的使用,提高代码性能。
12.使用缓存优化数据库操作:频繁的数据库查询和更新会影响代码的性能。
可以使用缓存机制来减少对数据库的访问,提高代码性能。
13.避免过度优化:过度的代码优化可能会导致代码复杂度增加,可读性和可维护性下降。
在优化代码时,需要平衡代码性能和代码质量之间的关系。
总结起来,优化代码运行速度需要考虑多个因素,包括选择合适的数据结构和算法、减少不必要的循环和函数调用、使用位运算和缓存优化、并行计算、减少磁盘和网络I/O操作等。
从硬件上提高python代码运行速度的方法

从硬件上提高Python代码运行速度的方法一、选择合适的硬件设备在编写Python代码时,选择合适的硬件设备是非常重要的。
如果是进行大规模数据处理或者复杂算法计算,选择性能优越的硬件设备可以极大提高代码运行速度。
选择高性能的CPU和内存,使用SSD硬盘代替传统机械硬盘等。
二、优化硬件设备的配置1. 升级CPU和内存在进行大规模数据处理或者复杂算法计算时,升级CPU和内存是提高Python代码运行速度的有效方法。
选择性能更强、核心数量更多的CPU,增加内存的容量和频率,能够提升代码运行速度。
2. 使用SSD硬盘代替传统机械硬盘SSD硬盘相比传统的机械硬盘在读写速度上有明显的优势。
如果程序需要频繁地进行文件读写操作,使用SSD硬盘可以大大提高代码运行速度。
3. 合理配置硬件资源合理配置硬件资源也是提高Python代码运行速度的重要一环。
将硬盘分区,将冗余文件转移到其他分区或外部存储设备,提高磁盘的读写效率;合理分配内存资源,避免内存泄漏或内存占用过高导致的性能下降等。
三、合理使用硬件设备1. 多线程与多进程Python中的多线程与多进程可以充分利用多核CPU的优势,提高代码运行速度。
通过合理的线程与进程调度,可以有效地降低代码运行时的等待时间。
2. GPU加速对于一些需要大规模并行计算的任务,可以考虑使用GPU进行加速计算。
目前很多GPU都支持CUDA或OpenCL等通用计算接口,可以充分发挥GPU在并行计算上的优势,提高Python代码的运行速度。
四、优化IO操作1. 使用异步IO在Python中,可以使用asyncio标准库来进行异步IO操作。
通过异步IO,可以在等待IO操作完成的同时执行其他任务,避免IO等待时间对代码运行速度的影响。
2. 使用缓存机制对于一些需要频繁读取的数据,可以考虑使用缓存机制来减少IO操作。
将一些需要频繁读取的数据缓存到内存中,可以有效地提高Python代码的运行速度。
编译器优化技术:提升代码执行速度

编译器优化技术:提升代码执行速度在现代软件开发中,编译器优化技术是提高程序性能的重要手段。
通过深入理解代码的行为和目标平台的架构特点,编译器能够在保持程序语义不变的前提下,对源代码进行转换,生成更加高效的机器代码。
本文将探讨几种常见的编译器优化技术及其对提升代码执行速度的影响。
首先是常量折叠(Constant Folding)。
这种技术涉及编译器在编译时对源代码中的常量表达式进行求值,从而避免了运行时的计算开销。
例如,若源代码中存在如“3 * 5”这样的表达式,编译器会直接将其替换为结果“15”,省去了实际执行时的乘法操作。
接着是无效代码消除(Dead Code Elimination)。
编译器能够识别并移除那些对程序输出没有任何影响的代码片段。
这通常发生在条件语句中,某些分支上的代码可能永远不会被执行,或者变量赋值后从未被使用。
移除这些无效代码减少了执行的指令数,进而加快了程序运行速度。
循环优化也是编译器技术中的重点。
循环展开(Loop Unrolling)是一种常见的方法,它通过减少循环次数来降低循环控制的开销。
例如,将一个需要迭代100次的循环展开成两个迭代50次的循环,可以减半循环计数器更新的次数,尽管这样做会增加代码量。
另一个相关技术是循环融合(Loop Fusion),它将多个相似的循环合并成一个,以减少重复的操作和提高缓存利用率。
函数内联(Function Inlining)是另一种重要的优化方法。
通过将调用频繁的小函数直接插入到调用点,编译器减少了函数调用的开销,包括参数传递、跳转和返回处理等。
这不仅提升了执行速度,还有助于其他优化,比如常量折叠和无效代码消除。
最后,编译器还会进行指令选择(Instruction Selection)和寄存器分配(Register Allocation)。
前者是指根据目标处理器的指令集选择最合适的机器指令来实现源代码的功能,而后者则是决定如何高效地利用有限的寄存器资源来存储和操作数据。
python 的 jit 方案

Python 有几种JIT(Just-In-Time)编译器可选方案,这些方案可以提升Python 代码的执行效率。
以下是几种常用的
JIT 方案:
1. PyPy:PyPy 是一个Python 解释器的替代品,它使用了即时编译技术来提高Python 代码的执行速度。
PyPy 通过使用JIT 技术对Python 代码进行动态优化,使其运行速度更快。
2. Numba:Numba 是一个开源的JIT 编译器,它可以将Python 代码编译成机器码,并对其进行优化以提高执行速度。
Numba 支持NumPy、pandas 等科学计算库,并能够自动识别和优化数学运算和其他计算密集型任务。
3. Cython:Cython 是一个Python 语言的扩展,它提供了C 语言的性能,同时保持了Python 的易用性。
通过将Python 代码转换为C 代码,Cython 可以实现更高的执行速度。
Cython 还支持JIT 技术,可以在运行时动态优化代码。
4. GraalVM:GraalVM 是一个高性能的运行时环境,支持多种编程语言,包括Python。
GraalVM 通过使用JIT 技术对Python 代码进行优化,可以提高代码的执行速度。
GraalVM 还提供了其他高级功能,如字节码转换、即时编译和并行执行等。
以上是几种常用的Python JIT 方案,它们可以帮助提高
Python 代码的执行效率。
选择哪种方案取决于具体的需求和场景。
提高C语言程序的执行效率

提高C语言程序的执行效率C语言是一种高效的编程语言,但是在编写程序时,仍然有很多方法可以进一步提高程序的执行效率。
下面是一些可以帮助你优化C语言程序的方法:1.使用合适的算法和数据结构:选择正确的算法和数据结构对于程序性能至关重要。
通过选择最适合特定问题的数据结构和算法,可以显著提高程序的效率。
例如,使用哈希表而不是线性可以快速查找数据。
2.减少循环次数:循环是程序中最常见的性能瓶颈之一、你可以通过减少循环的次数来提高程序的效率。
这可以通过避免重复计算和重复操作来实现。
3.减少函数调用次数:函数调用是有一定开销的,尤其是在递归调用时。
尽量减少函数的嵌套和递归调用,可以显著提高程序的效率。
4.使用适当的数据类型:选择适当的数据类型可以减少内存占用和提高运行速度。
例如,使用整数类型代替浮点数类型可以提高运算速度。
另外,使用位操作可以更快地执行一些操作,如位移和位掩码。
5.避免冗余计算:如果一个变量的值在循环中没有变化,可以将计算移到循环之外,避免重复计算。
这样可以减少不必要的计算,提高程序的效率。
6.减少内存访问次数:内存访问是有一定开销的,尤其是在访问缓存行时。
尽量减少对内存的访问次数,可以提高程序的效率。
这可以通过使用局部变量替代全局变量、减少数组访问次数等方式实现。
7. 编译器优化:现代的编译器通常会进行一定的优化,以提高程序的执行效率。
你可以尝试使用优化选项来编译代码,例如对循环进行展开、inline函数等,以获得更好的性能。
8.并行化和多线程:如果你的程序可以并行执行,可以考虑使用多线程或并行计算来加快程序的执行速度。
这可以通过使用线程库或并行计算库来实现,并确保线程之间正确地共享数据。
9.降低输入/输出操作:输入/输出操作通常是较慢的操作。
如果可能的话,可以尝试减少输入/输出操作的次数,或者使用更高效的输入/输出方法,如内存映射文件。
10.使用内联汇编:在一些特定的情况下,使用内联汇编可以获得更高的性能。
如何通过编译器优化提高程序运行速度(一)

程序运行速度是开发者和用户都非常关心的问题。
一个高效的编译器可以通过各种优化手段,使得程序在运行时能够更快地执行。
本文将从编译器优化的角度来探讨如何提高程序的运行速度。
一、代码生成优化代码生成是编译器的最后一步,也是最重要的一步。
通过优化代码生成过程,可以显著提高程序的运行速度。
1、寄存器分配优化编译器可以通过寄存器分配优化,将变量存储于寄存器中,减少对内存的访问。
寄存器分配算法可以基于图染色理论进行优化,将变量分配到可用的寄存器中,并且尽量减少寄存器之间的数据传输。
2、指令选择优化在代码生成阶段,编译器需要将高级语言转化为机器指令。
指令选择优化可以选择适当的指令,使得程序在执行时更高效。
一些现代编译器还会利用SIMD指令集进行向量化优化,提高了计算密集型程序的性能。
二、优化算法和数据结构除了代码生成优化,还可以通过改进算法和数据结构来提高程序的运行速度。
1、算法优化选择合适的算法是提高程序运行速度的关键。
一些常见的算法,如排序算法、查找算法等,存在不同的实现方式,它们的时间复杂度和空间复杂度也各不相同。
通过选择更高效的算法可以减少程序的执行时间。
2、数据结构优化合理选择数据结构也能够提高程序的运行速度。
例如,对于需要频繁查找的操作,可以使用哈希表或二叉查找树等数据结构来加快查找速度。
对于需要频繁插入和删除的操作,可以选择使用链表等数据结构。
三、循环优化循环是程序中常见的结构,也是性能优化的热点。
通过循环优化可以显著改善程序的性能。
1、循环展开通过循环展开,可以减少循环的迭代次数,提高执行效率。
循环展开可以利用现代处理器的指令级并行性,使得多个迭代可以同时执行。
2、循环不变量代码外提循环中的不变量代码可以提到循环外执行,减少循环内的计算量。
这样可以避免重复计算相同的值,提高程序的运行效率。
四、内存访问优化内存访问是程序执行过程中的耗时操作,通过内存访问优化可以减少数据读写操作,提高程序的运行速度。
编程技巧:提高代码运行效率的7个方法

编程技巧:提高代码运行效率的7个方法在编写代码的过程中,我们经常面临着提高代码运行效率的挑战。
无论是因为面对庞大的数据集还是需要快速响应用户的需求,优化代码的执行速度都是至关重要的。
在本文中,我们将介绍7个提高代码运行效率的方法,帮助你更高效地编写代码。
1. 使用适当的数据结构选择合适的数据结构是提高代码运行效率的关键。
不同的数据结构有不同的特点和应用场景。
例如,如果你需要频繁地插入和删除元素,链表可能比数组更适合;如果你需要快速查找元素,哈希表可能是更好的选择。
了解常见的数据结构及其优劣势,根据具体需求选择最合适的数据结构,可以显著提高代码的执行效率。
2. 减少不必要的计算在编写代码时,避免进行不必要的计算是提高代码运行效率的关键。
通过使用缓存结果、避免重复计算和合并类似的操作,可以减少代码中的计算量。
此外,了解并利用数学运算的性质和规律,可以简化计算过程,提高代码执行效率。
3. 使用并行计算当面对大规模数据集或复杂计算任务时,使用并行计算可以显著提高代码运行效率。
通过将任务划分为多个子任务,并发地执行这些子任务,可以充分利用计算资源的并行性。
现代编程语言和框架通常提供了并行计算的工具和接口,使并行编程变得更加容易。
4. 编写高效的算法算法的选择和实现方式对代码的运行效率有很大影响。
一些常见的算法问题,如果使用低效的算法解决,可能会导致代码运行速度慢得无法接受。
因此,学习并掌握高效的算法,选择最适合特定问题的算法,是提高代码运行效率的重要手段。
5. 减少内存占用内存占用是影响代码运行效率的一个关键因素。
当代码执行过程中需要大量的内存时,可能会导致内存溢出或交换内存到磁盘,从而降低代码的执行速度。
因此,减少内存占用可以提高代码的运行效率。
一些常见的内存优化技巧包括使用合适的数据结构、及时释放不再使用的内存和避免内存泄漏。
6. 使用编译器优化现代编译器通常具有各种优化选项,可以提高代码的运行效率。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
8. 检查字符串是否为空
大多数程序员在检查字符串是否为空时会使用下面的方法:
If Text1.Text = "" then ' 执行操作 End if
17. 使用对象数组
当设计用户界面时,对于同样类型的控件,程序员应该尽量使用对象数组。你可以做一个实验:在窗口上 添加 100 个 PictureBox,每个 PictureBox 都有不同的名称,运行程序。然后创建一个新的工程,同样在窗口上添 加 100 个 PictureBox,不过这一次使用对象数组,运行程序,你可以注意到两个程序加载时间上的差别。
' 使用 With With frmMain.Text1 .Text = "Learn VB" .Alignment = 0 .Tag = "Its my life" .BackColor = vbBlack .ForeColor = vbWhite End With
或者
' 使用另一个对象保存子对象 Dim txtTextBox as TextBox Set txtTextBox = frmMain.Text1 TxtTextBox.Text = "Learn VB" TxtTextBox.Alignment = 0 TxtTextBox.Tag = "Its my life" TxtTextBox.BackColor = vbBlack TxtTextBox.ForeColor = vbWhite
Dim FSO as New FileSystemObject 3. 尽量避免使用属性
在平时的代码中,最常见的比较低效的代码就是在可以使用变量的情况下,反复使用属性(Property),尤
其是在循环中。要知道存取变量的速度是存取属性的速度的 20 倍左右。下面这段代码是很多程序员在程序中会 使用到的:
注意,上面提到的方法只适用于需要对一个对象的子对象进行操作的时候,下面这段代码是不正确的:
With Text1 .Text = "Learn VB" .Alignment = 0 .Tag = "Its my life" .BackColor = vbBlack .ForeColor = vbWhite End With
Dim FSO as New FileSystemObject ' 执行操作 ' 销毁对象 Set FSO = Nothing 对于窗体,可以进行卸载:
Unload frmMain
或
Set frmMain = Nothing
13. 变长和定长字符串
从技术上来说,与变长字符串相比,定长字符串需要较少的处理时间和空间。但是定长字符串的缺点在于 在很多情况下,你都需要调用 Trim 函数以去除字符串末的空字符,这样反而会降低代码效率。所以除非是字符 串的长度不会变化,否则还是使用变长字符串。
Loop Text1.Text = bufferVar
然而,下面的代码完成了相同的功能,而且还要快:
Text1.Text = Input(F, LOF(F))
如上述,几种方法都实现了同样的任务;同时,最好的算法也是最优的。
4. 尽量使用数组,避免使用集合
除非你必须使用集合(Collection),否则你应该尽量使用数组。据测试,数组的存取速度可以达到集合的 100 倍。这个数字听起来有点骇人听闻,但是如果你考虑到集合是一个对象,你就会明白为什么差异会这么大。
同样地,像这样的代码 . . .
Do Until EOF(F) Line Input #F, nextLine Text1.Text = Text1.Text + nextLine
Loop
. . . 比下面的代码慢得多:
Do Until EOF(F) Line Input #F, nextLine bufferVar = bufferVar + nextLine
14. 使用类模块,而不是 ActiveX 控件
除非 ActiveX 控件涉及到用户界面,否则尽量使用轻量的对象,例如类。这两者之间的效率有很大差异。
15. 使用内部对象
在涉及到使用 ActiveX 控件和 DLL 的时候,很多程序员喜欢将它们编译好,然后再加入工程中。我建议你 最好不要这样做,因为从 VB 连接到一个外部对象需要耗费大量的 CPU 处理能力。每当你调用方法或存取属性 的时候,都会浪费大量的系统资源。如果你有 ActiveX 控件或 DLL 的源代码,将它们作为工程的私有对象。
' 错误的代码 For iCount = 1 to 10 ' 执行操作 Next iCount ' 正确的代码 For iCount = 1 to 10 ' 执行操作 Next
10. 使用数组,而不是多个变量
当你有多个保存类似数据的变量时,可以考虑将他们用一个数组代替。在 VB 中,数组是最高效的数据结构 之一。
在这里顺带提一句,对于 Object 对象来自存在同样的问题。请看下面的代码:
Dim FSO Set FSO = New Scripting.FileSystemObject
或
Dim FSO as object Set FSO = New Scripting.FileSystemObject
上面的代码由于在申明的时候没有指定数据类型,在赋值时将浪费内存和 CPU 时间。正确的代码应该象下 面这样:
7. 减少对子对象的引用
在 VB 中,通过使用.来实现对象的引用。例如:
Form1.Text1.Text
在上面的例子中,程序引用了两个对象:Form1 和 Text1。利用这种方法引用效率很低。但遗憾的是,没有 办法可以避免它。程序员唯一可以做就是使用 With 或者将用另一个对象保存子对象(Text1)。
21. 使用类可以提高软件的整体性能 VB 提供的机制不完全支持面向对象的设计和编码,但是 VB 提供了简单的类。大多数人认为使用对象将导致 代码的效率降低。对于这一点我个人有些不同的意见;考察代码的效率不能纯粹从运行速度的角度出发,软件 占用的资源也是需要考虑的因素之一。使用类可以帮助你在整体上提升软件的性能。
11. 使用动态数组,而不是静态数组
使用动态数组对代码的执行速度不会产生太大的影响,但是在某些情况下可以节约大量的资源。
12. 销毁对象
无论编写的是什么软件,程序员都需要考虑在用户决定终止软件运行后释放软件占用的内存空间。但遗憾 的是很多程序员对这一点好像并不是很在意。正确的做法是在退出程序前需要销毁程序中使用的对象。例如:
16. 减少模块的数量
有些人喜欢将通用的函数保存在模块中,对于这一点我表示赞同。但是在一个模块中只写上二三十行代码 就有些可笑了。如果你不是非常需要模块,尽量不要使用它。这样做的原因是因为只有在模块中的函数或变量 被调用时,VB 才将模块加载到内存中;当 VB 应用程序退出时,才会从内存中卸载这些模块。如果代码中只有 一个模块,VB 就只会进行一次加载操作,这样代码的效率就得到了提高;反之如果代码中有多个模块,VB 会 进行多次加载操作,代码的效率会降低。
很不幸,进行字符串比较需要的处理量甚至比读取属性还要大。因此我建议大家使用下面的方法:
If Len(Text1.Text) = 0 then ' 执行操作 End if
9. 去除 Next 关键字后的变量名
在 Next 关键字后加上变量名会导致代码的效率下降。我也不知道为什么会这样,只是一个经验而已。不过 我想很少有程序员会这样画蛇添足,毕竟大多数程序员都是惜字如金的人。
Image1.Move 0,0,100,100
19. 减少图片的使用
图片将占用大量内存,而且处理图片也需要占用很多 CPU 资源。在软件中,如果可能的话,可以考虑用背 景色来替代图片--当然这只是从技术人员的角度出发看这个问题。
20. 使用 ActiveX DLL,而不是 ActiveX 控件
如果你设计的 ActiveX 对象不涉及到用户界面,使用 ActiveX DLL。
2. 避免使用变体
对于一个 VB 程序员来说,这是再明显不过的事情了。变体类型的变量需要 16 个字节的空间来保存数据, 而一个整数(Integer)只需要 2 个字节。通常使用变体类型的目的是为了减少设计的工作量和代码量,也有的程 序员图个省事而使用它。但是如果一个软件经过了严格设计和按照规范编码的话,完全可以避免使用变体类 型。
提高代码的运行速度
本文描述了如何通过一些技术手段来提高 VB 代码的执行效率。这些手段可以分为两个大的部分:编码技术和 编译优化技术。本文从编码技术和编译技术来讨论。
第一部分:编码技术。 下面的这些方法(到现在为止共 27 种)可以帮助你提高代码的运行速度:
1. 使用整数(Integer)和长整数(Long) 提高代码运行速度最简单的方法莫过于使用正确的数据类型了。也许你不相信,但是正确地选择数据类型 可以大幅度提升代码的性能。在大多数情况下,程序员可以将 Single,Double 和 Currency 类型的变量替换为 Integer 或 Long 类型的变量,因为 VB 处理 Integer 和 Long 的能力远远高于处理其它几种数据类型。下面是排 序: Long 最快 Integer . Byte . Single . Double . Currency 最慢
Dim intCon as Integer For intCon = 0 to Ubound(SomVar()) Text1.Text = Text1.Text & vbcrlf & SomeVar(intCon) Next intCon