Текущий архив: 2004.07.11;
Скачать: CL | DM;
Вниз
Быстрое чтение файла Найти похожие ветки
← →
Fay © (2004-06-24 06:38) [40]2Кастуся (23.06.04 22:28) [37]
Твой способ удаления пробелов в строке ДИКО медленный.
Сравни с [33] на 10000 символах.
← →
Кастуся (2004-06-24 08:42) [41]
> Fay © (24.06.04 06:38) [40]
понимаю, что медленный, скажи как быстрее, чем предложил Romkin!
← →
Кастуся (2004-06-24 08:58) [42]
> Anatoly Podgoretsky © (23.06.04 22:58) [39]
> Для конвертации такой строки нужен Int128
такового типа нет в Дельфи! Как быть?
← →
Fay © (2004-06-24 09:46) [43]2Кастуся (24.06.04 08:58) [42]
Правильно, нет. Но АП и не говорил, что нет - он сказал "нужен"
← →
Fay © (2004-06-24 09:48) [44]2Кастуся (24.06.04 08:42) [41]
Сильно быстрее не получится. Не "стоит выделки".
← →
имя (2004-06-24 09:48) [45]Удалено модератором
← →
Fay © (2004-06-24 09:51) [46]2www.shegeda.by.ru (24.06.04 09:48) [45]
Какой выигрыш?
← →
имя (2004-06-24 09:58) [47]Удалено модератором
← →
имя (2004-06-24 10:00) [48]Удалено модератором
← →
Кастуся (2004-06-24 11:09) [49]
> www.shegeda.by.ru (24.06.04 09:48) [45]
твой алгоритм не работает. Я его в процедуру пихаю:procedure DelSpaces(var S: String);
var
NewLength : integer;
begin
asm
mov edx, s
mov ebx, s
jmp @@NextChar
@@NextChar:
mov al, [ebx]
inc ebx
or al, al
jz @@StrEnd
cmp al, " "
je @@NextChar
@@CopyChar:
mov [edx], al
inc edx
jmp @@NextChar
@@StrEnd:
mov [edx], al
sub edx, s
mov NewLength, edx
end;
SetLength(s,NewLength);
end;
> www.shegeda.by.ru (24.06.04 09:58) [47]
> Это во-первых...
> Во вторых, нужно ли чтение файла?
когда я закомментировал всю обработку строк, а отавил только чтение стандартным методом:while not eof(f) do
readln(f,st);
то мой файл в 8Мб прочитывает за 0.4с. Впечатляет? Так что с этим проблем нету.
А вообще, чего я уже добился с момента начала этой ветки, меня впечатляет! Скорость обработки увеличилась раза в 4-5!!!
← →
Romkin © (2004-06-24 11:21) [50]Не надо беспокоиться, думаю, DelSpaces в моей редакции уже перестала быть узким местом.
Простой пример: допустим, есть программа, и одна функция в ней отнимает 4% времени обработки. Ускорив эту функцию в два раза, вы получите уменьшение времени... всего на 2%.
ЛУчше посмотреть на другие участки программы...
А еще лучше воспользоваться профилировщиком
← →
Fay © (2004-06-24 11:27) [51]2Romkin © (24.06.04 11:21) [50]
К тому же, код [45] не годится для string 8)
← →
Romkin © (2004-06-24 11:28) [52]Кстати, насколько я понял, тебе значение строки не нужно? Тогда StrToInt64, но разбей строку на две половины - как раз влезет.
Может, все-таки скажешь, что у процедуры на входе и что нужно получить на выходе?
← →
Anatoly Podgoretsky © (2004-06-24 11:32) [53]www.shegeda.by.ru (24.06.04 09:48) [45]
Ты диверсант?
← →
имя (2004-06-24 11:46) [54]Удалено модератором
← →
имя (2004-06-24 12:07) [55]Удалено модератором
← →
Fay © (2004-06-24 12:19) [56]2www.shegeda.by.ru (24.06.04 11:46) [54]
Как Вы думаете, для чего Delphi вызывает UniqueStringA?
← →
Anatoly Podgoretsky © (2004-06-24 12:22) [57]www.shegeda.by.ru (24.06.04 11:46) [54]
Так и продолжаешь провоцировать на неприятности в системе?
← →
имя (2004-06-24 12:27) [58]Удалено модератором
← →
Fay © (2004-06-24 12:37) [59]2www.shegeda.by.ru (24.06.04 12:27) [58]
Код скорее "для PChar". Delphi в таком случае лепит вполне пригодный код, хотя на asm-е легко сделать лучше 8).
← →
имя (2004-06-24 12:46) [60]Удалено модератором
← →
Fay © (2004-06-24 12:55) [61]Можно глупый вопрос? А зачем вот такие
FHandle:=0;
штуки?!
← →
имя (2004-06-24 12:59) [62]Удалено модератором
← →
Fay © (2004-06-24 13:06) [63]function TMappedFile.GetIsOpen: boolean;
begin
Result := FHandle <> DWORD(-1);
end;
← →
Fay © (2004-06-24 14:22) [64]Моя версия на основе www.shegeda.by.ru [60]
8)unit MappedFile;
interface
uses
Windows, SysUtils;
type
TMappedFile = class
private
FHandle : DWORD;
FMapping : DWORD;
FSize : DWORD;
FView : PChar;
FActive : Boolean;
FName : string;
procedure SetSize(const Value : DWORD);
procedure SetName(const Value : string);
procedure SetActive(const Value : Boolean);
function GetActive : Boolean;
public
constructor Create;
destructor Destroy; override;
procedure Close;
procedure Open;
property Size : DWORD read FSize write SetSize;
property Data : PChar read FView;
property Active : Boolean read GetActive write SetActive;
property Name : string read FName write SetName;
end;
implementation
constructor TMappedFile.Create;
begin
FHandle := INVALID_HANDLE_VALUE;
FName := "";
end;
destructor TMappedFile.Destroy;
begin
Close;
inherited;
end;
procedure TMappedFile.SetName(const Value : string);
begin
if Active then
raise Exception.Create("Нельзя изменить имя!");
FName := Value;
end;
procedure TMappedFile.SetSize(const Value : DWORD);
begin
if Active then
raise Exception.Create("Нельзя изменить размер!");
FSize := Value;
end;
procedure TMappedFile.SetActive(const Value : Boolean);
var
sz : DWORD;
begin
if FActive = Value then Exit;
if Value then
begin
FHandle := CreateFile(
PChar(FName),
GENERIC_READ or GENERIC_WRITE,
FILE_SHARE_READ,
nil,
OPEN_EXISTING,
FILE_FLAG_RANDOM_ACCESS,
0);
if FHandle = INVALID_HANDLE_VALUE then
RaiseLastOSError;
sz := GetFileSize(FHandle, nil);
if FSize > sz then
begin
SetFilePointer(FHandle, FSize, nil, FILE_BEGIN);
SetEndOfFile(FHandle);
SetFilePointer(FHandle, 0, nil, FILE_BEGIN);
end
else
FSize := sz;
FMapping := CreateFileMapping(
FHandle,
nil,
PAGE_READWRITE,
0, FSize,
nil);
if FMapping = 0 then
begin
CloseHandle(FHandle);
FHandle := INVALID_HANDLE_VALUE;
RaiseLastOSError;
end;
FView := MapViewOfFile(
FMapping,
FILE_MAP_ALL_ACCESS,
0, 0,
0);
if FView = nil then
begin
CloseHandle(FHandle);
CloseHandle(FMapping);
FHandle := INVALID_HANDLE_VALUE;
FMapping := 0;
RaiseLastOSError;
end;
FSize := GetFileSize(FHandle, nil);
end
else
begin
UnmapViewOfFile(FView);
CloseHandle(FMapping);
CloseHandle(FHandle);
FView := nil;
FMapping := 0;
FHandle := INVALID_HANDLE_VALUE;
end;
FActive := Value;
end;
function TMappedFile.GetActive : Boolean;
begin
Result := FHandle <> INVALID_HANDLE_VALUE;
end;
procedure TMappedFile.Open;
begin
Active := True;
end;
procedure TMappedFile.Close;
begin
Active := False;
end;
end.
← →
Fay © (2004-06-24 14:31) [65]Пляски с sz в SetActive - левые 8)
← →
Кастуся (2004-06-24 17:12) [66]
> Romkin © (24.06.04 11:21) [50]
> ЛУчше посмотреть на другие участки программы...
> А еще лучше воспользоваться профилировщиком
А что такое профилировщикик? Это я так понимаю поределяет что сколько времени занимет в программе? Это какая-то программа и где её достать?
> Romkin © (24.06.04 11:28) [52]
> Кстати, насколько я понял, тебе значение строки не нужно?
> Тогда StrToInt64, но разбей строку на две половины - как
> раз влезет.
Я вот ут думаю, а будет ли это все быстрее работать, чем простоHexSt:="0"+"1"+"2"+"3"+"4"+"5"+"6"+"7"+"8"+"9"+"a"+"b"+"c"+"d"+"e"+"f";
Bad:=not (LastDelimiter(HexSt,w0)=32);
← →
Кастуся (2004-06-24 18:35) [67]короче пробовал я StrToInt64 - медленно работает
← →
имя (2004-06-24 19:21) [68]Удалено модератором
Примечание: Смени ник
← →
имя (2004-06-24 20:30) [69]Удалено модератором
Примечание: Смени ник.
← →
Anatoly Podgoretsky © (2004-06-24 21:13) [70]Слушай не лез бы ты в ассемблер, который раз по счету приводишь грубый и чрезвычайно опасный код. Ты бы хоть раз прочитал справку про встроеный ассемблер и соглашения.
← →
Кастуся (2004-06-24 22:01) [71]
> Anatoly Podgoretsky © (24.06.04 21:13) [70]
> Слушай не лез бы ты в ассемблер, который раз по счету приводишь
> грубый и чрезвычайно опасный код. Ты бы хоть раз прочитал
> справку про встроеный ассемблер и соглашения.
а чем приведённый код може быть опсаным?
← →
Кастуся (2004-06-25 10:08) [72]Так чем?
← →
Anatoly Podgoretsky © (2004-06-25 10:25) [73]Неправильное использоние регистров, в результате могут быть выполнены недопустимые вещи, абсольтно любые и AV самое легкое что может произойти. Код абсолютно безграмотен, именно все приведеные с использование ассемблера.
← →
Romkin © (2004-06-25 11:29) [74]Упс... Все почистили. Зачем же красный карандаш, когда синего было достаточно?!
Кастуся (24.06.04 17:12) [66] Да, именно определяет расход времени на разные функции. GPProfile, например. НАйти можно, достаточно поискать Delphi profiler ;)
И, кстати, почему бы просто не делать кусочную оптимизацию, а переписать все на конечный автомат? Уверяю, скорее всего быстрее, чем автомат ты вряд ли сделаешь.
И я уже пару раз просил дать постановку, а что собственно требуется-то? Улучшать код надо разумно, и, на мой взгляд, лезть в дебри ассемблера и проблемно-зависимой оптимизации кода надо в крайнем случае. Если скорость универсального короткого кода не устраивает, прежде всего надо посмотреть, нельзя ли сам алгоритм улучшить
← →
Кастуся (2004-06-25 15:57) [75]
> Romkin © (25.06.04 11:29) [74]
Может тебе интересно, конечно, что у меня за задача, но, еаверное, ИМХО лень будет тебе что-нибудь делать. В принципе, из этой ветки я извлек для себя массу полезного, благодаря чему, скорость работы моего алгоритма увеличилась в несколько раз.
> почему бы просто не делать кусочную оптимизацию, а переписать
> все на конечный автомат?
А можно пару слов про "конечный автомат"? Что енто такое и с чем его едят?
Так что спасибо огромное всем за помощь!
> Anatoly Podgoretsky © (25.06.04 10:25) [73]
а асм коды чьи-то там все равно не работали!
← →
Anatoly Podgoretsky © (2004-06-25 16:03) [76]Они могли работать в крайнем ограниченом количестве случаев, в большинстве случаев должны приводить к ошибке, хорошо если не критической.
← →
Fay © (2004-06-25 16:32) [77]2Кастуся (25.06.04 15:57) [75]
> А можно пару слов про "конечный автомат"? Что енто такое
> и с чем его едят?
Вам не стыдно, товарищ? Интернет забит подобной инфой. Да и институте не умалчивают 8)
← →
Romkin © (2004-06-25 16:36) [78]>А можно пару слов про "конечный автомат"? Что енто такое и с чем его едят?
НУ я же уже давал:
Romkin © (23.06.04 18:09) [31]
Основная идея простая: файл рассматривается как непрерывный поток байт, каждый из которых проходит через "фильтр", который реагирует на него изменением состояния (и данных). В результате - DelSpaces, например, вообще не нужна будет, реакция на пробел простая - continue :))
← →
Кастуся (2004-06-25 18:39) [79]классно конечно
Ладно всем спасибо!!!
← →
Кастуся (2004-06-27 09:32) [80]Снова чуть-чуть продолжим
> Romkin © (25.06.04 16:36) [78]
Если считывать файл побайтно, возникает проблема с определением положения троки идентификатора. Вот задача:
в общем случае есть в тексте сообщение вида:
MESSAGE: ## ## ## ## ## ##;
Необходимо его идентифицировать и получить, то что находится вместо #. Вот. как это реализ с пом-ю конечн автомата?
Страницы: 1 2 3 вся ветка
Текущий архив: 2004.07.11;
Скачать: CL | DM;
Память: 0.64 MB
Время: 0.036 c