- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想在我的NXP LPC11U37H主板(ARM Cortex-M0)上分析一些算法,因为我想知道执行特定算法需要多少个时钟周期。
我编写了这些简单的宏来进行一些分析:
#define START_COUNT clock_cycles = 0;\
Chip_TIMER_Enable(LPC_TIMER32_1);\
Chip_TIMER_Reset(LPC_TIMER32_1);\
#define STOP_COUNT Chip_TIMER_Disable(LPC_TIMER32_1);\
#define GET_COUNT clock_cycles = Chip_TIMER_ReadCount(LPC_TIMER32_1);\
myprintf("%d\n\r", clock_cycles);\
START_COUNT;
algorithm();
STOP_COUNT;
GET_COUNT;
START_COUNT;
for (volatile int i = 0; i < 1000; i++);
STOP_COUNT;
GET_COUNT;
START_COUNT;
for (volatile int i = 0; i < 1000; i++);
STOP_COUNT;
GET_COUNT;
START_COUNT;
for (volatile int i = 0; i < 1000; i++);
STOP_COUNT;
GET_COUNT;
21076
19074
21074
最佳答案
好的,很开心,为您举了一个简单的例子。首先,每年都会过去,不知道迈克尔·阿布拉什(Michael Abrash)是谁的新开发人员来了,世界已经改变了,工具更好,硬件更好,很多人都可以进行调整。但是禅宗的汇编语言与IMO非常相关,尤其是这个问题。
https://github.com/jagregory/abrash-zen-of-asm
当这本书问世时,8088是个老新闻,而今天对其进行性能调整的意义甚至不大。但是,如果这是您在本书中看到的全部内容,那么您将丢失。我用在下面学到的东西,每天都在逻辑,芯片和板上跳动……使它们发挥作用和/或使它们断裂。
答案的重点不一定是显示如何概要分析某些内容,尽管它可以,因为您已经在概要分析某些内容。但这有助于表明它并不像您期望的那样简单,除了您编写的C代码之外,还有其他因素。 C代码在flash中的放置,flash与ram,是否等待状态,是否预取(如果有),分支预测(如果有)都将产生很大的不同。我什至可以演示相同的指令序列,但对齐方式会有所不同,从而改变结果。高兴的是,您在cortex-m0上没有缓存,这会使混乱并平方...
我在某处有NXP芯片,并且附近至少有一个cortex-m0 +,但是从st.com选择了一个cortex-m0。 STM32F030K6T6,因为它已经连接好并可以使用了。有一个内置的8Mhz振荡器和一个pll乘以,因此首先使用8Mhz然后再使用48。它没有四个不同的等待状态作为您的芯片,它有两种选择,小于或等于24Mhz或大于(最多48个)。但是它确实有预取功能,您可能没有。
您可能有一个systick计时器,芯片供应商可以选择是否编译。它们始终位于同一地址(到目前为止,在cortex-ms中)
#define STK_CSR 0xE000E010
#define STK_RVR 0xE000E014
#define STK_CVR 0xE000E018
#define STK_MASK 0x00FFFFFF
PUT32(STK_CSR,4);
PUT32(STK_RVR,0xFFFFFFFF);
PUT32(STK_CVR,0x00000000);
PUT32(STK_CSR,5);
//count down.
.thumb_func
.globl PUT32
PUT32:
str r1,[r0]
bx lr
.align 8
.thumb_func
.globl TEST
TEST:
ldr r3,[r0]
test_loop:
sub r1,#1
bne test_loop
ldr r2,[r0]
sub r3,r2
mov r0,r3
bx lr
08000100 <TEST>:
8000100: 6803 ldr r3, [r0, #0]
08000102 <test_loop>:
8000102: 3901 subs r1, #1
8000104: d1fd bne.n 8000102 <test_loop>
8000106: 6802 ldr r2, [r0, #0]
8000108: 1a9b subs r3, r3, r2
800010a: 1c18 adds r0, r3, #0
800010c: 4770 bx lr
800010e: 46c0 nop ; (mov r8, r8)
8000110: 46c0 nop ; (mov r8, r8)
8000112: 46c0 nop ; (mov r8, r8)
PUT32(FLASH_ACR,0x00);
ra=TEST(STK_CVR,1000);
hexstring(ra);
ra=TEST(STK_CVR,1000);
hexstring(ra);
PUT32(FLASH_ACR,0x10);
ra=TEST(STK_CVR,1000);
hexstring(ra);
ra=TEST(STK_CVR,1000);
hexstring(ra);
PUT32(FLASH_ACR,0x01);
ra=TEST(STK_CVR,1000);
hexstring(ra);
ra=TEST(STK_CVR,1000);
hexstring(ra);
PUT32(FLASH_ACR,0x11);
ra=TEST(STK_CVR,1000);
hexstring(ra);
ra=TEST(STK_CVR,1000);
hexstring(ra);
00000FA0
00000FA0
00000FA0
00000FA0
00001B56
00001B56
00000FA2
00000FA2
add one nop
00001388
00001388
00001388
00001388
00001F3F
00001F3F
00001389
00001389
two nops
00001770
00001770
00001770
00001770
0000270E
0000270E
00001B57
00001B57
three nops
00001B58
00001B58
00001B58
00001B58
00002AF7
00002AF7
00002133
00002133
eight nops
00002EE0
00002EE0
00002EE0
00002EE0
00004A36
00004A36
000036AE
000036AE
9
000032C8
000032C8
000032C8
000032C8
00004E1F
00004E1F
00003A96
00003A96
10
000036B0
000036B0
000036B0
000036B0
000055EE
000055EE
00003E7E
00003E7E
11
00003A98
00003A98
00003A98
00003A98
000059D7
000059D7
00004266
00004266
12
00003E80
00003E80
00003E80
00003E80
000061A6
000061A6
0000464E
0000464E
16
00004E20
00004E20
00004E20
00004E20
00007916
00007916
000055EE
000055EE
no wait state speeds
0x0FA0 = 4000 0
0x1388 = 5000 1
0x1770 = 6000 2
0x1B58 = 7000 3
0x2EE0 = 12000 8
0x4E20 = 20000 16
slow flash times
0x1B56 = 6998 0
0x1F3F = 7999 1
0x270E = 9998 2
0x2AF7 = 10999 3
0x4A36 = 18998 8
0x4E1F = 19999 9
0x55EE = 21998 10
0x59D7 = 22999 11
0x61A6 = 24998 12
0x7916 = 30998
slow, no prefetch
00001B56
00001B56
slow, with prefetch
00000FA0
00000FA2
9 wait states
00004E1F
00004E1F
00003A96
00003A96
10 wait states
000055EE
000055EE
00003E7E
00003E7E
b one
nop
nop
nop
one:
b two
nop
nop
nop
two:
ra=0x20000800;
PUT16(ra,0x6803); ra+=2;
PUT16(ra,0x3901); ra+=2;
PUT16(ra,0xd1fd); ra+=2;
PUT16(ra,0x6802); ra+=2;
PUT16(ra,0x1a9b); ra+=2;
PUT16(ra,0x1c18); ra+=2;
PUT16(ra,0x4770); ra+=2;
PUT16(ra,0x46c0); ra+=2;
PUT16(ra,0x46c0); ra+=2;
PUT16(ra,0x46c0); ra+=2;
PUT16(ra,0x46c0); ra+=2;
PUT16(ra,0x46c0); ra+=2;
PUT16(ra,0x46c0); ra+=2;
ra=branchto(STK_CVR,1000,0x20000801);
hexstring(ra);
ra=branchto(STK_CVR,1000,0x20000801);
hexstring(ra);
.thumb_func
.globl branchto
branchto:
bx r2
00000FA2
00000FA0
关于c - 相同(重复)代码的时钟周期值不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36627456/
已关闭。这个问题是 off-topic 。目前不接受答案。 想要改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 已关闭10 年前。 Improve th
我正在尝试将 JSON 发送到我的服务器并作为结果检索 JSON。例如发送用户名和密码并取回 token 和其他内容。 这就是我正在为发送的 HTTP 请求所做的。我现在如何检索同一请求中的内容?
我有以下 xts 矩阵: > options(digits.secs = 6) > set.seed(1234) > xts(1:10, as.POSIXlt(1366039619, tz="EST"
我目前正在开发一个应用程序,当用户到达某个位置时,它会提醒用户。我希望这个应用程序也在后台运行并搜索解决方案。 在 AppStore 中,我发现了一款名为“Sleep Cycle”的应用程序,它可
我想创建一个基于 farbtastic color picker 的颜色选择器。我想要实现的是添加我想要链接到色轮的 RGB slider 。这是我到目前为止所拥有的。 app.controller(
RFC 5545 允许 RDATE 属性具有 PERIOD 数据类型。该数据类型的语义是什么?据我所知,这是未指定的。它会改变事件的持续时间吗?如果时区更改且没有持续时间怎么办? 最佳答案 尽管我
在 CodinGame学习平台,C# 教程中用作示例的问题之一是: The aim of this exercise is to check the presence of a number in a
我听说网上有一本英特尔书,它描述了特定汇编指令所需的 CPU 周期,但我找不到(经过努力)。谁能告诉我如何找到CPU周期? 这是一个例子,在下面的代码中,mov/lock 是 1 个 CPU 周期,x
据我所知,Java GC有次要GC(低成本)和主要GC周期(高成本)。如果对象在本地范围内,则会在 Minor GC 中清理它。如果对象的引用存储在代码中的其他位置,则它会在主 GC 中被清除。 例如
到目前为止,我有一个很好的自旋锁,可以用作 intendend: std::atomic_flag barrier = ATOMIC_FLAG_INIT; inline void lo
晚上好,我将 cycle2 与 prev 和 next 函数一起使用,但我无法将 prev 和 next 函数置于图像下方的中心。我环顾四周,我知道这会很愚蠢,但我就是看不到它。非常令人沮丧。谢谢加里
出于教育目的,我想知道在优化(在不同级别)和编译之后执行函数需要多少 CPU 周期。有没有办法分析代码或可执行文件以获得可重现的答案?我在 64 位 Windows 7 Pro 上使用 Eclipse
我想彻底测量和调整我的 C/C++ 代码,以便在 x86_64 系统上更好地使用缓存。我知道如何使用计数器(我的 Windows 机器上的 QueryPerformanceCounter)来测量时间,
我尝试将一些数据分组到每四周一次的存储桶中,并使用 pd.Grouper(key='created_at', freq='4W')。我希望这些组是这样的,如果我有从 2019-08-26 到 2019
我正在做一个关于随机数的大型学校项目,但我找不到 Math.random() 的句点。我安装了 7.0.800.15 版本,并且正在使用 Windows 10 计算机。我试过用一个简单的程序来确定周期
我正在努力解决我们生产环境中垃圾收集利用率高的问题,我想知道设置一个大的堆大小来保证老年代永远不会被填满是否会阻止触发主要的 GC 周期。 为了实现这一点,我想有一个特定的阈值标记会触发主要的 GC
我想测量在 Python 3 中执行加法运算所需的时钟周期数。 我写了一个程序来计算加法运算的平均值: from timeit import timeit def test(n): for i
我正在寻找一种方法来测量线程上的函数调用所花费的 cpu 周期。 示例伪代码: void HostFunction() { var startTick = CurrentThread.Cur
就 CPU 周期而言,malloc() 的成本是多少?(Vista/OS,最新版本的 gcc,最高优化级别,...) 基本上,我正在实现一个复杂的 DAG 结构(类似于链表)由一些 16B(不太常见)
C/C++ 中的类型转换会导致额外的 CPU 周期吗? 我的理解是,至少在某些情况下应该消耗额外的 CPU 周期。就像从浮点类型转换为整数一样,CPU 需要将浮点结构转换为整数。 float a=2.
我是一名优秀的程序员,十分优秀!