user-0 提问: fseek问题

回复:
user: user-1
content: 衡量普通硬盘的性能不是用时间复杂度和空间复杂度；而是用转速、寻道时间、IO时间、……综合起来就是每秒多少MB，试试用HDTunePro软件测试一下你的硬盘的各项指标。

user: user-2
content: 如果使用fat32 的画，差不多是一个字节一个字节的来

user: user-2
content: 跟使用的磁盘文件系统有关

user: user-3
content: 好高深复杂啊。。。。

user: user-1
content: 谁来保证两个小文件或一个大文件的两个不同部分，分布在机械硬盘上的同一磁道内，当在两者之间来回切换读写时不用寻道呢？！

user: user-4
content: 引用 18 楼 zxh707wk 的回复:[quote=引用 17 楼 Android_iPhone 的回复:] [quote=引用 12 楼 zxh707wk 的回复:] [quote=引用 11 楼 Android_iPhone 的回复:] 文件指针就是指针，存的就是地址。 如果打开一个2G的文本文件，那么按照你的说法这2G的每个字节都有一个指针对应？ 还有，导航地图依靠的是网络传输，而不是本地文件 [/quote]  如果打开一个2G的文本文件，那么按照你的说法这2G的每个字节都有一个指针对应？  关于这个问题，回答如下：  如果打开一个2G的文本文件，有一个指向这个文本文件的指针。 而文本文件中的2G个字节都有一个唯一的地址，是操作系统在保存这个文件时就已经事前决定好的了。  fseek可以通过origin和offset参数，迅速的立即定位到任何一个想要访问的地址，而不是1个字节1个字节的遍历 对于计算机来讲，定位到第1个字节，第2个字节，第N个字节，所用的时间是基本上相差无几的  针对原来楼主的问题的回复如下： 这个时间复杂度是o(1) ，能随机移位到n，而不是一个个移 [/quote]但存储在硬盘上的文件字节是随机的，你知道第一个字节的地址，却不一定知道第二个字节的地址[/quote]   你是错误的. 一个文件在电脑上有一个首地址,, 并且是连续的内存地址. 比如说我一个文本文件里面内容是 abcdefg a在磁盘里面的地址是100 那么b就是100+2(sizeof(char)是2), 那么如果你知道a的地址了 你要跳到f处只需要让地址做简单的加法就可以了 100+2*5 = 110 这就是f的地址. 所以不需要遍历

user: user-5
content: 寻道和旋转似乎可以并行，不知道硬盘是怎么做的， 是不是还要测试，是否到达某一磁道到了。

user: user-5
content: 引用 28 楼 zhao4zhong1 的回复: 唉，硬盘转速的单位，也搞错了 不过按照，你提供的资料，寻道时间，和转一圈的时间数量级别是一样的。 单独一个小文件读写（M以内）， 只怕几乎不用去寻道的，估计只需要第一次读写寻道，就差不多了（其余数据可以放在缓冲里）。 那种测试是一种极端条件测试， 如果只是读写一个文件，或者3，5个文件，只怕也不会寻道很多次。

user: user-5
content: 引用 28 楼 zhao4zhong1 的回复:http://bollaxu.iteye.com/blog/858320的内容： 硬盘一次读写的时间由两个部分组成：  time = latency + data_size / bandwidth     latency主要由平均硬盘寻道时间和平均硬盘转动延迟组成。硬盘有多个磁盘片组成，每个磁盘又由N个同心的track构成，每个track又分成M个sector。磁头移动到目标track，就是寻道的时间(seek time)。那硬盘转动延迟(rotational delay)取决于硬盘转速，即如果硬盘转速为7200rpm(每分钟7200转)，那每转一圈就要1/120=8.3ms，平均延迟就是它的一般，大概是4.17ms。一般的硬盘平均寻道时间是8ms，那么latency就是8+4.17=12.17ms。     所以一般小文件的传输时间主要由latency来决定，而大文件的传输时间则受latency影响较小。而看硬盘性能的时候，主要要看它对小文件的随机读写速度(市面上的所谓传输速率大多是大文件的连续读写，是理想状态，所以实际的性能往往要差很多)。 那看来我想错了，不过现在记录密度又高了，只怕也不能确定到底哪个快

user: user-6
content: 你就想一下  int a = 10; int *p = &a;  我要得到p所指向的值   难道要从0x00000000开始移动吗？

user: user-1
content: http://bollaxu.iteye.com/blog/858320的内容： 硬盘一次读写的时间由两个部分组成：  time = latency + data_size / bandwidth     latency主要由平均硬盘寻道时间和平均硬盘转动延迟组成。硬盘有多个磁盘片组成，每个磁盘又由N个同心的track构成，每个track又分成M个sector。磁头移动到目标track，就是寻道的时间(seek time)。那硬盘转动延迟(rotational delay)取决于硬盘转速，即如果硬盘转速为7200rpm(每分钟7200转)，那每转一圈就要1/120=8.3ms，平均延迟就是它的一般，大概是4.17ms。一般的硬盘平均寻道时间是8ms，那么latency就是8+4.17=12.17ms。     所以一般小文件的传输时间主要由latency来决定，而大文件的传输时间则受latency影响较小。而看硬盘性能的时候，主要要看它对小文件的随机读写速度(市面上的所谓传输速率大多是大文件的连续读写，是理想状态，所以实际的性能往往要差很多)。

user: user-1
content: 引用 26 楼 lm_whales 的回复:[quote=引用 24 楼 zhao4zhong1 的回复:] [quote=引用 22 楼 lm_whales 的回复:] 约等于O(1) 一般来说，不会消耗太多时间，大概不应该超过磁盘转半圈 。 现在磁盘转速一般是 7200/S或者更高 一圈消耗时间 1/7200 秒应该很快了  另外，磁盘操作都是带缓冲的，摊还时间，应该还是O(1)的 一般读取若干块数据，可以只有一次真正的磁盘寻道。 磁头来回移动的时间不算了？[/quote ]磁头移动比旋转要快，因为移动位置非常小，虽然旋转是持续的，但是一圈距离 跟磁道间距比较，还是巨大无比的数字。 平均起来，还是旋转要慢。    [/quote] 具体我也不是很清楚。我印象中来回移动的延迟要比在同一柱面等所需扇区转到磁头下面的延迟大。 有此为证：http://bollaxu.iteye.com/blog/858320

user: user-5
content: 引用 24 楼 zhao4zhong1 的回复:[quote=引用 22 楼 lm_whales 的回复:] 约等于O(1) 一般来说，不会消耗太多时间，大概不应该超过磁盘转半圈 。 现在磁盘转速一般是 7200/S或者更高 一圈消耗时间 1/7200 秒应该很快了  另外，磁盘操作都是带缓冲的，摊还时间，应该还是O(1)的 一般读取若干块数据，可以只有一次真正的磁盘寻道。 磁头来回移动的时间不算了？[/quote ]磁头移动比旋转要快，因为移动位置非常小，虽然旋转是持续的，但是一圈距离 跟磁道间距比较，还是巨大无比的数字。 平均起来，还是旋转要慢。

user: user-1
content: 在文件大小相同的前提下：  读刚读过的文件比头次读没读过的文件快  读转速快的硬盘上的文件比读转速慢的硬盘上的文件快  读没有磁盘碎片的文件比读有磁盘碎片的文件快  读文件不处理比边读边处理快  单线程从头到尾一次读文件比多线程分别读文件各部分快（非固态硬盘上）  读固态硬盘上的文件比读普通硬盘上的文件快

user: user-1
content: 引用 22 楼 lm_whales 的回复:约等于O(1) 一般来说，不会消耗太多时间，大概不应该超过磁盘转半圈 。 现在磁盘转速一般是 7200/S或者更高 一圈消耗时间 1/7200 秒应该很快了  另外，磁盘操作都是带缓冲的，摊还时间，应该还是O(1)的 一般读取若干块数据，可以只有一次真正的磁盘寻道。 磁头来回移动的时间不算了？

user: user-5
content: 要知道，操作系统很多时候，  都是不停的在内存和磁盘上交换数据， 你一般感觉不到，这个过程。

user: user-5
content: 约等于O(1) 一般来说，不会消耗太多时间，大概不应该超过磁盘转半圈 。 现在磁盘转速一般是 7200/S或者更高 一圈消耗时间 1/7200 秒应该很快了  另外，磁盘操作都是带缓冲的，摊还时间，应该还是O(1)的 一般读取若干块数据，可以只有一次真正的磁盘寻道。

user: user-7
content: 可以想象成直接跳转，一个个跳的话，太慢了，不科学

user: user-8
content: 呵呵，记得当年初学个位数加法的时候，老师还教过要用手指头单步跟踪...

user: user-9
content: 引用 18 楼 zxh707wk 的回复:[quote=引用 17 楼 Android_iPhone 的回复:] [quote=引用 12 楼 zxh707wk 的回复:] [quote=引用 11 楼 Android_iPhone 的回复:] 文件指针就是指针，存的就是地址。 如果打开一个2G的文本文件，那么按照你的说法这2G的每个字节都有一个指针对应？ 还有，导航地图依靠的是网络传输，而不是本地文件 [/quote]  如果打开一个2G的文本文件，那么按照你的说法这2G的每个字节都有一个指针对应？  关于这个问题，回答如下：  如果打开一个2G的文本文件，有一个指向这个文本文件的指针。 而文本文件中的2G个字节都有一个唯一的地址，是操作系统在保存这个文件时就已经事前决定好的了。  fseek可以通过origin和offset参数，迅速的立即定位到任何一个想要访问的地址，而不是1个字节1个字节的遍历 对于计算机来讲，定位到第1个字节，第2个字节，第N个字节，所用的时间是基本上相差无几的  针对原来楼主的问题的回复如下： 这个时间复杂度是o(1) ，能随机移位到n，而不是一个个移 [/quote]但存储在硬盘上的文件字节是随机的，你知道第一个字节的地址，却不一定知道第二个字节的地址[/quote]    对啊，是我考虑不周，虽然知道第一个字节的地址，但是光用图片中的Offset，肯定不能马上计算出来后面字节的地址，那算法得多复杂啊。 老师说的还是对，必须得一个字节一个字节的移动到后面才行，这个时间复杂度是o(n)才对。  当n非常大的时候，比如即使是一个本地视频，如果很大的话，我们打开它马上开始从头播放，一般不会卡； 而如果一下子拖到比较靠后的地方，确实会稍微卡一下的。 认真仔细考虑了一下，还得相信老师才正确。