psych
psych copied to clipboard
Psych-based yaml in Ruby 1.9.3 too slow
Here is a script to illustrate the difference in timing between load_file
under Psych and under Syck. It is simple-minded but is very illustrative of my actual use case. The output on my machine reads:
Psych
17.156296968460083
Syck
5.016614198684692
Resulting loaded hash the same? true
So you can see that Psych is taking over three times as long. (Timings on Ruby 1.8.7 are comparable to the Syck time shown here. It was the switch to Ruby 1.9.3 that alerted me to the issue.) Here's the script:
require 'yaml'
h1 = h2 = nil
f = Pathname.new(__FILE__).dirname + "autoglossary.yaml"
t = Time.new.to_f
300.times {h1 = YAML.load_file(f)}
puts "Psych", Time.new.to_f - t
YAML::ENGINE.yamler = 'syck'
t = Time.new.to_f
300.times {h2 = YAML.load_file(f)}
puts "Syck", Time.new.to_f - t
puts "Resulting loaded hash the same? #{h1 == h2}"
=begin here's what autoglossary.yaml looks like
---
index: &2161004220
:path: !ruby/object:Pathname
path: index.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/index.txt
:linetext: Script Debugger Help
script debugger help: *2161004220
develop:
:path: !ruby/object:Pathname
path: indexfolder/develop.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/develop.txt
:linetext: Develop
debug:
:path: !ruby/object:Pathname
path: indexfolder/developfolder/debug.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/developfolder/debug.txt
:linetext: Debug
breakpoi: &2160978360
:path: !ruby/object:Pathname
path: indexfolder/developfolder/debugfolder/breakpoi.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/developfolder/debugfolder/breakpoi.txt
:linetext: Breakpoints
breakpoints: *2160978360
breakpointsinsp: &2153040020
:path: !ruby/object:Pathname
path: indexfolder/developfolder/debugfolder/breakpoifolder/breakpointsinsp.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/developfolder/debugfolder/breakpoifolder/breakpointsinsp.txt
:linetext: Breakpoints Inspector
breakpoints inspector: *2153040020
executet: &2153027260
:path: !ruby/object:Pathname
path: indexfolder/developfolder/debugfolder/breakpoifolder/executet.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/developfolder/debugfolder/breakpoifolder/executet.txt
:linetext: Execute to Here
execute to here: *2153027260
tempbreak: &2152998760
:path: !ruby/object:Pathname
path: indexfolder/developfolder/debugfolder/breakpoifolder/tempbreak.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/developfolder/debugfolder/breakpoifolder/tempbreak.txt
:linetext: Temporary Breakpoints
temporary breakpoints: *2152998760
callchain: &2152944680
:path: !ruby/object:Pathname
path: indexfolder/developfolder/debugfolder/callchain.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/developfolder/debugfolder/callchain.txt
:linetext: Call Stack
call stack: *2152944680
codecove: &2152936000
:path: !ruby/object:Pathname
path: indexfolder/developfolder/debugfolder/codecove.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/developfolder/debugfolder/codecove.txt
:linetext: Code Coverage
code coverage: *2152936000
exceptio: &2152928080
:path: !ruby/object:Pathname
path: indexfolder/developfolder/debugfolder/exceptio.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/developfolder/debugfolder/exceptio.txt
:linetext: Exceptions
exceptions: *2152928080
executew: &2152907460
:path: !ruby/object:Pathname
path: indexfolder/developfolder/debugfolder/executew.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/developfolder/debugfolder/executew.txt
:linetext: Execute When Debugging
execute when debugging: *2152907460
expressi: &2152888420
:path: !ruby/object:Pathname
path: indexfolder/developfolder/debugfolder/expressi.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/developfolder/debugfolder/expressi.txt
:linetext: Expressions
expressions: *2152888420
external: &2152867220
:path: !ruby/object:Pathname
path: indexfolder/developfolder/debugfolder/external.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/developfolder/debugfolder/external.txt
:linetext: External Debugging
external debugging: *2152867220
mini: &2152779820
:path: !ruby/object:Pathname
path: indexfolder/developfolder/debugfolder/mini.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/developfolder/debugfolder/mini.txt
:linetext: The Mini Debugger
the mini debugger: *2152779820
pause:
:path: !ruby/object:Pathname
path: indexfolder/developfolder/debugfolder/pause.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/developfolder/debugfolder/pause.txt
:linetext: Pause
step:
:path: !ruby/object:Pathname
path: indexfolder/developfolder/debugfolder/step.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/developfolder/debugfolder/step.txt
:linetext: Step
trace:
:path: !ruby/object:Pathname
path: indexfolder/developfolder/debugfolder/trace.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/developfolder/debugfolder/trace.txt
:linetext: Trace
variablesdebug: &2152445340
:path: !ruby/object:Pathname
path: indexfolder/developfolder/debugfolder/variablesdebug.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/developfolder/debugfolder/variablesdebug.txt
:linetext: Variables (Debug Mode)
variables (debug mode): *2152445340
edit:
:path: !ruby/object:Pathname
path: indexfolder/developfolder/edit.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/developfolder/edit.txt
:linetext: Edit
editinga: &2152290020
:path: !ruby/object:Pathname
path: indexfolder/developfolder/editfolder/editinga.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/developfolder/editfolder/editinga.txt
:linetext: Editing and Navigation
editing and navigation: *2152290020
balance: &2152181400
:path: !ruby/object:Pathname
path: indexfolder/developfolder/editfolder/editingafolder/balance.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/developfolder/editfolder/editingafolder/balance.txt
:linetext: Delimiters
delimiters: *2152181400
bbedit: &2152117320
:path: !ruby/object:Pathname
path: indexfolder/developfolder/editfolder/editingafolder/bbedit.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/developfolder/editfolder/editingafolder/bbedit.txt
:linetext: External Editor
external editor: *2152117320
block: &2151906120
:path: !ruby/object:Pathname
path: indexfolder/developfolder/editfolder/editingafolder/block.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/developfolder/editfolder/editingafolder/block.txt
:linetext: Block Structure
block structure: *2151906120
clipping: &2151882160
:path: !ruby/object:Pathname
path: indexfolder/developfolder/editfolder/editingafolder/clipping.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/developfolder/editfolder/editingafolder/clipping.txt
:linetext: Clippings
clippings: *2151882160
clippingdetails: &2151876760
:path: !ruby/object:Pathname
path: indexfolder/developfolder/editfolder/editingafolder/clippingfolder/clippingdetails.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/developfolder/editfolder/editingafolder/clippingfolder/clippingdetails.txt
:linetext: How Clippings Work
how clippings work: *2151876760
comment:
:path: !ruby/object:Pathname
path: indexfolder/developfolder/editfolder/editingafolder/comment.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/developfolder/editfolder/editingafolder/comment.txt
:linetext: Comment
completion: &2164232840
:path: !ruby/object:Pathname
path: indexfolder/developfolder/editfolder/editingafolder/completion.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/developfolder/editfolder/editingafolder/completion.txt
:linetext: Text Completion
text completion: *2164232840
dragdrop: &2164229640
:path: !ruby/object:Pathname
path: indexfolder/developfolder/editfolder/editingafolder/dragdrop.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/developfolder/editfolder/editingafolder/dragdrop.txt
:linetext: Inserting Content
inserting content: *2164229640
find:
:path: !ruby/object:Pathname
path: indexfolder/developfolder/editfolder/editingafolder/find.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/developfolder/editfolder/editingafolder/find.txt
:linetext: Find
goto: &2164223040
:path: !ruby/object:Pathname
path: indexfolder/developfolder/editfolder/editingafolder/goto.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/developfolder/editfolder/editingafolder/goto.txt
:linetext: Go To Line
go to line: *2164223040
misctype: &2164219520
:path: !ruby/object:Pathname
path: indexfolder/developfolder/editfolder/editingafolder/misctype.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/developfolder/editfolder/editingafolder/misctype.txt
:linetext: Miscellaneous Typing and Selection
miscellaneous typing and selection: *2164219520
navigate:
:path: !ruby/object:Pathname
path: indexfolder/developfolder/editfolder/editingafolder/navigate.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/developfolder/editfolder/editingafolder/navigate.txt
:linetext: Navigate
shift:
:path: !ruby/object:Pathname
path: indexfolder/developfolder/editfolder/editingafolder/shift.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/developfolder/editfolder/editingafolder/shift.txt
:linetext: Shift
split: &2164209620
:path: !ruby/object:Pathname
path: indexfolder/developfolder/editfolder/editingafolder/split.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/developfolder/editfolder/editingafolder/split.txt
:linetext: Splitting the Editor
splitting the editor: *2164209620
substitution: &2164206420
:path: !ruby/object:Pathname
path: indexfolder/developfolder/editfolder/editingafolder/substitution.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/developfolder/editfolder/editingafolder/substitution.txt
:linetext: Text Substitution
text substitution: *2164206420
tab:
:path: !ruby/object:Pathname
path: indexfolder/developfolder/editfolder/editingafolder/tab.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/developfolder/editfolder/editingafolder/tab.txt
:linetext: Tab
tell: &2164199720
:path: !ruby/object:Pathname
path: indexfolder/developfolder/editfolder/editingafolder/tell.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/developfolder/editfolder/editingafolder/tell.txt
:linetext: Tell Blocks and Terms Blocks
tell blocks and terms blocks: *2164199720
scriptwi: &2164196400
:path: !ruby/object:Pathname
path: indexfolder/developfolder/editfolder/scriptwi.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/developfolder/editfolder/scriptwi.txt
:linetext: Script Window
script window: *2164196400
default: &2164192800
:path: !ruby/object:Pathname
path: indexfolder/developfolder/editfolder/scriptwifolder/default.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/developfolder/editfolder/scriptwifolder/default.txt
:linetext: Default Script Size and State
default script size and state: *2164192800
view: &2164189460
:path: !ruby/object:Pathname
path: indexfolder/developfolder/editfolder/scriptwifolder/view.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/developfolder/editfolder/scriptwifolder/view.txt
:linetext: View Options in a Script Window
view options in a script window: *2164189460
chevron: &2164185940
:path: !ruby/object:Pathname
path: indexfolder/developfolder/editfolder/scriptwifolder/viewfolder/chevron.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/developfolder/editfolder/scriptwifolder/viewfolder/chevron.txt
:linetext: Raw (Chevron) Syntax
raw (chevron) syntax: *2164185940
invisibl: &2164182460
:path: !ruby/object:Pathname
path: indexfolder/developfolder/editfolder/scriptwifolder/viewfolder/invisibl.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/developfolder/editfolder/scriptwifolder/viewfolder/invisibl.txt
:linetext: Invisibles
invisibles: *2164182460
linenumb: &2164178920
:path: !ruby/object:Pathname
path: indexfolder/developfolder/editfolder/scriptwifolder/viewfolder/linenumb.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/developfolder/editfolder/scriptwifolder/viewfolder/linenumb.txt
:linetext: Line Numbers
line numbers: *2164178920
spaces:
:path: !ruby/object:Pathname
path: indexfolder/developfolder/editfolder/scriptwifolder/viewfolder/spaces.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/developfolder/editfolder/scriptwifolder/viewfolder/spaces.txt
:linetext: Spaces
tabstops: &2164172500
:path: !ruby/object:Pathname
path: indexfolder/developfolder/editfolder/scriptwifolder/viewfolder/tabstops.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/developfolder/editfolder/scriptwifolder/viewfolder/tabstops.txt
:linetext: Tab Stops
tab stops: *2164172500
wrap: &2164169180
:path: !ruby/object:Pathname
path: indexfolder/developfolder/editfolder/scriptwifolder/viewfolder/wrap.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/developfolder/editfolder/scriptwifolder/viewfolder/wrap.txt
:linetext: Line Wrapping
line wrapping: *2164169180
run:
:path: !ruby/object:Pathname
path: indexfolder/developfolder/run.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/developfolder/run.txt
:linetext: Run
compile:
:path: !ruby/object:Pathname
path: indexfolder/developfolder/runfolder/compile.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/developfolder/runfolder/compile.txt
:linetext: Compile
errors:
:path: !ruby/object:Pathname
path: indexfolder/developfolder/runfolder/errors.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/developfolder/runfolder/errors.txt
:linetext: Errors
leaks:
:path: !ruby/object:Pathname
path: indexfolder/developfolder/runfolder/errorsfolder/leaks.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/developfolder/runfolder/errorsfolder/leaks.txt
:linetext: Leaks
execute:
:path: !ruby/object:Pathname
path: indexfolder/developfolder/runfolder/execute.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/developfolder/runfolder/execute.txt
:linetext: Execute
handlers: &2164148440
:path: !ruby/object:Pathname
path: indexfolder/developfolder/runfolder/executefolder/handlers.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/developfolder/runfolder/executefolder/handlers.txt
:linetext: Testing Handlers
testing handlers: *2164148440
log: &2164144740
:path: !ruby/object:Pathname
path: indexfolder/developfolder/runfolder/log.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/developfolder/runfolder/log.txt
:linetext: Event Log
event log: *2164144740
logwindow: &2164141360
:path: !ruby/object:Pathname
path: indexfolder/developfolder/runfolder/logfolder/logwindow.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/developfolder/runfolder/logfolder/logwindow.txt
:linetext: Event Log Window
event log window: *2164141360
parent: &2164137740
:path: !ruby/object:Pathname
path: indexfolder/developfolder/runfolder/parent.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/developfolder/runfolder/parent.txt
:linetext: Parent Script
parent script: *2164137740
record:
:path: !ruby/object:Pathname
path: indexfolder/developfolder/runfolder/record.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/developfolder/runfolder/record.txt
:linetext: Record
result:
:path: !ruby/object:Pathname
path: indexfolder/developfolder/runfolder/result.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/developfolder/runfolder/result.txt
:linetext: Result
target: &2164125920
:path: !ruby/object:Pathname
path: indexfolder/developfolder/runfolder/target.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/developfolder/runfolder/target.txt
:linetext: Default Target
default target: *2164125920
times:
:path: !ruby/object:Pathname
path: indexfolder/developfolder/runfolder/times.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/developfolder/runfolder/times.txt
:linetext: Times
variable: &2164118680
:path: !ruby/object:Pathname
path: indexfolder/developfolder/runfolder/variable.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/developfolder/runfolder/variable.txt
:linetext: Variables
variables: *2164118680
explore:
:path: !ruby/object:Pathname
path: indexfolder/explore.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/explore.txt
:linetext: Explore
dictiona: &2164111140
:path: !ruby/object:Pathname
path: indexfolder/explorefolder/dictiona.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/explorefolder/dictiona.txt
:linetext: Dictionary
dictionary: *2164111140
appexplorer: &2164107160
:path: !ruby/object:Pathname
path: indexfolder/explorefolder/dictionafolder/appexplorer.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/explorefolder/dictionafolder/appexplorer.txt
:linetext: Application Explorer
application explorer: *2164107160
tellcontextinspector: &2164103460
:path: !ruby/object:Pathname
path: indexfolder/explorefolder/dictionafolder/appexplorerfolder/tellcontextinspector.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/explorefolder/dictionafolder/appexplorerfolder/tellcontextinspector.txt
:linetext: Tell Context Inspector
tell context inspector: *2164103460
dictwindow: &2164099860
:path: !ruby/object:Pathname
path: indexfolder/explorefolder/dictionafolder/dictwindow.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/explorefolder/dictionafolder/dictwindow.txt
:linetext: Dictionary Window
dictionary window: *2164099860
backandf: &2164095820
:path: !ruby/object:Pathname
path: indexfolder/explorefolder/dictionafolder/dictwindowfolder/backandf.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/explorefolder/dictionafolder/dictwindowfolder/backandf.txt
:linetext: Back and Forward
back and forward: *2164095820
browser: &2164092300
:path: !ruby/object:Pathname
path: indexfolder/explorefolder/dictionafolder/dictwindowfolder/browser.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/explorefolder/dictionafolder/dictwindowfolder/browser.txt
:linetext: Terminology List
terminology list: *2164092300
browseritemtypes: &2164088500
:path: !ruby/object:Pathname
path: indexfolder/explorefolder/dictionafolder/dictwindowfolder/browserfolder/browseritemtypes.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/explorefolder/dictionafolder/dictwindowfolder/browserfolder/browseritemtypes.txt
:linetext: Types of Entities Shown in the Terminology List
types of entities shown in the terminology list: *2164088500
hierarch: &2164085300
:path: !ruby/object:Pathname
path: indexfolder/explorefolder/dictionafolder/dictwindowfolder/hierarch.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/explorefolder/dictionafolder/dictwindowfolder/hierarch.txt
:linetext: Hierarchies and Diagrams
hierarchies and diagrams: *2164085300
info: &2164082020
:path: !ruby/object:Pathname
path: indexfolder/explorefolder/dictionafolder/dictwindowfolder/info.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/explorefolder/dictionafolder/dictwindowfolder/info.txt
:linetext: Dictionary Info Pane
dictionary info pane: *2164082020
codes: &2164078400
:path: !ruby/object:Pathname
path: indexfolder/explorefolder/dictionafolder/dictwindowfolder/infofolder/codes.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/explorefolder/dictionafolder/dictwindowfolder/infofolder/codes.txt
:linetext: Apple Event Codes
apple event codes: *2164078400
extra: &2164075220
:path: !ruby/object:Pathname
path: indexfolder/explorefolder/dictionafolder/dictwindowfolder/infofolder/extra.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/explorefolder/dictionafolder/dictwindowfolder/infofolder/extra.txt
:linetext: Extra Documentation
extra documentation: *2164075220
inherita: &2164071860
:path: !ruby/object:Pathname
path: indexfolder/explorefolder/dictionafolder/dictwindowfolder/infofolder/inherita.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/explorefolder/dictionafolder/dictwindowfolder/infofolder/inherita.txt
:linetext: Inheritance
inheritance: *2164071860
size:
:path: !ruby/object:Pathname
path: indexfolder/explorefolder/dictionafolder/dictwindowfolder/infofolder/size.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/explorefolder/dictionafolder/dictwindowfolder/infofolder/size.txt
:linetext: Size
lookupde: &2164064680
:path: !ruby/object:Pathname
path: indexfolder/explorefolder/dictionafolder/dictwindowfolder/lookupde.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/explorefolder/dictionafolder/dictwindowfolder/lookupde.txt
:linetext: Look Up Definition
look up definition: *2164064680
otherthi: &2164061100
:path: !ruby/object:Pathname
path: indexfolder/explorefolder/dictionafolder/dictwindowfolder/otherthi.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/explorefolder/dictionafolder/dictwindowfolder/otherthi.txt
:linetext: Miscellaneous Dictionary Actions
miscellaneous dictionary actions: *2164061100
searchin: &2164057540
:path: !ruby/object:Pathname
path: indexfolder/explorefolder/dictionafolder/dictwindowfolder/searchin.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/explorefolder/dictionafolder/dictwindowfolder/searchin.txt
:linetext: Search in Dictionary
search in dictionary: *2164057540
opendict: &2164053980
:path: !ruby/object:Pathname
path: indexfolder/explorefolder/dictionafolder/opendict.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/explorefolder/dictionafolder/opendict.txt
:linetext: Open Dictionary Window
open dictionary window: *2164053980
currentappdict: &2164050040
:path: !ruby/object:Pathname
path: indexfolder/explorefolder/dictionafolder/opendictfolder/currentappdict.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/explorefolder/dictionafolder/opendictfolder/currentappdict.txt
:linetext: Running Applications
running applications: *2164050040
currentcontextdict: &2164046240
:path: !ruby/object:Pathname
path: indexfolder/explorefolder/dictionafolder/opendictfolder/currentcontextdict.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/explorefolder/dictionafolder/opendictfolder/currentcontextdict.txt
:linetext: Current Context
current context: *2164046240
dictionariesinsp: &2164042300
:path: !ruby/object:Pathname
path: indexfolder/explorefolder/dictionafolder/opendictfolder/dictionariesinsp.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/explorefolder/dictionafolder/opendictfolder/dictionariesinsp.txt
:linetext: Dictionaries Inspector
dictionaries inspector: *2164042300
openanydict: &2164038420
:path: !ruby/object:Pathname
path: indexfolder/explorefolder/dictionafolder/opendictfolder/openanydict.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/explorefolder/dictionafolder/opendictfolder/openanydict.txt
:linetext: Open Any Dictionary Window
open any dictionary window: *2164038420
recentappdict: &2164034140
:path: !ruby/object:Pathname
path: indexfolder/explorefolder/dictionafolder/opendictfolder/recentappdict.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/explorefolder/dictionafolder/opendictfolder/recentappdict.txt
:linetext: Recent and Favorite Applications
recent and favorite applications: *2164034140
scriptingadditionsdict: &2164029860
:path: !ruby/object:Pathname
path: indexfolder/explorefolder/dictionafolder/opendictfolder/scriptingadditionsdict.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/explorefolder/dictionafolder/opendictfolder/scriptingadditionsdict.txt
:linetext: Scripting Additions
scripting additions: *2164029860
explorer:
:path: !ruby/object:Pathname
path: indexfolder/explorefolder/explorer.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/explorefolder/explorer.txt
:linetext: Explorer
aeprint:
:path: !ruby/object:Pathname
path: indexfolder/explorefolder/explorerfolder/aeprint.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/explorefolder/explorerfolder/aeprint.txt
:linetext: AEPrint
best:
:path: !ruby/object:Pathname
path: indexfolder/explorefolder/explorerfolder/best.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/explorefolder/explorerfolder/best.txt
:linetext: Best
outliner:
:path: !ruby/object:Pathname
path: indexfolder/explorefolder/explorerfolder/bestfolder/outliner.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/explorefolder/explorerfolder/bestfolder/outliner.txt
:linetext: Outliner
outlinermore: &2164010660
:path: !ruby/object:Pathname
path: indexfolder/explorefolder/explorerfolder/bestfolder/outlinermore.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/explorefolder/explorerfolder/bestfolder/outlinermore.txt
:linetext: Outliner Editing
outliner editing: *2164010660
explorerviewoptions: &2164006160
:path: !ruby/object:Pathname
path: indexfolder/explorefolder/explorerfolder/explorerviewoptions.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/explorefolder/explorerfolder/explorerviewoptions.txt
:linetext: Explorer View Options and Actions
explorer view options and actions: *2164006160
explorerwindows: &2164000500
:path: !ruby/object:Pathname
path: indexfolder/explorefolder/explorerfolder/explorerwindows.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/explorefolder/explorerfolder/explorerwindows.txt
:linetext: Explorer Windows
explorer windows: *2164000500
source:
:path: !ruby/object:Pathname
path: indexfolder/explorefolder/explorerfolder/source.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/explorefolder/explorerfolder/source.txt
:linetext: Source
whereexplorers: &2163993560
:path: !ruby/object:Pathname
path: indexfolder/explorefolder/explorerfolder/whereexplorers.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/explorefolder/explorerfolder/whereexplorers.txt
:linetext: Where Explorers Appear
where explorers appear: *2163993560
openinga: &2163989600
:path: !ruby/object:Pathname
path: indexfolder/openinga.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/openinga.txt
:linetext: Opening and Saving Scripts
opening and saving scripts: *2163989600
bundle:
:path: !ruby/object:Pathname
path: indexfolder/openingafolder/bundle.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/openingafolder/bundle.txt
:linetext: Bundle
descript: &2163980940
:path: !ruby/object:Pathname
path: indexfolder/openingafolder/descript.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/openingafolder/descript.txt
:linetext: Description
description: *2163980940
library:
:path: !ruby/object:Pathname
path: indexfolder/openingafolder/library.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/openingafolder/library.txt
:linetext: Library
librarytech: &2163972700
:path: !ruby/object:Pathname
path: indexfolder/openingafolder/libraryfolder/librarytech.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/openingafolder/libraryfolder/librarytech.txt
:linetext: Technical Details About Libraries
technical details about libraries: *2163972700
manifest:
:path: !ruby/object:Pathname
path: indexfolder/openingafolder/manifest.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/openingafolder/manifest.txt
:linetext: Manifest
open:
:path: !ruby/object:Pathname
path: indexfolder/openingafolder/open.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/openingafolder/open.txt
:linetext: Open
chooser: &2163961560
:path: !ruby/object:Pathname
path: indexfolder/openingafolder/openfolder/chooser.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/openingafolder/openfolder/chooser.txt
:linetext: The Template Chooser
the template chooser: *2163961560
compatib: &2163957700
:path: !ruby/object:Pathname
path: indexfolder/openingafolder/openfolder/compatib.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/openingafolder/openfolder/compatib.txt
:linetext: Compatibility
compatibility: *2163957700
importre: &2163953640
:path: !ruby/object:Pathname
path: indexfolder/openingafolder/openfolder/importre.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/openingafolder/openfolder/importre.txt
:linetext: Opening a Compiled Script as Text
opening a compiled script as text: *2163953640
tabs:
:path: !ruby/object:Pathname
path: indexfolder/openingafolder/openfolder/tabs.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/openingafolder/openfolder/tabs.txt
:linetext: Tabs
save:
:path: !ruby/object:Pathname
path: indexfolder/openingafolder/save.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/openingafolder/save.txt
:linetext: Save
fileowne: &2163941980
:path: !ruby/object:Pathname
path: indexfolder/openingafolder/savefolder/fileowne.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/openingafolder/savefolder/fileowne.txt
:linetext: File Owner
file owner: *2163941980
formats:
:path: !ruby/object:Pathname
path: indexfolder/openingafolder/savefolder/formats.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/openingafolder/savefolder/formats.txt
:linetext: Formats
applicat: &2163934740
:path: !ruby/object:Pathname
path: indexfolder/openingafolder/savefolder/formatsfolder/applicat.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/openingafolder/savefolder/formatsfolder/applicat.txt
:linetext: Application
application: *2163934740
compiled: &2163930160
:path: !ruby/object:Pathname
path: indexfolder/openingafolder/savefolder/formatsfolder/compiled.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/openingafolder/savefolder/formatsfolder/compiled.txt
:linetext: Compiled Script
compiled script: *2163930160
text:
:path: !ruby/object:Pathname
path: indexfolder/openingafolder/savefolder/formatsfolder/text.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/openingafolder/savefolder/formatsfolder/text.txt
:linetext: Text
runonly: &2163922280
:path: !ruby/object:Pathname
path: indexfolder/openingafolder/savefolder/runonly.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/openingafolder/savefolder/runonly.txt
:linetext: Run-Only Script
run-only script: *2163922280
spotlight: &2163918000
:path: !ruby/object:Pathname
path: indexfolder/openingafolder/savefolder/spotlight.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/openingafolder/savefolder/spotlight.txt
:linetext: Spotlight and Quick Look
spotlight and quick look: *2163918000
whatissaved: &2163914400
:path: !ruby/object:Pathname
path: indexfolder/openingafolder/savefolder/whatissaved.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/openingafolder/savefolder/whatissaved.txt
:linetext: What Is Saved
what is saved: *2163914400
referenc: &2163910340
:path: !ruby/object:Pathname
path: indexfolder/referenc.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/referenc.txt
:linetext: Reference
reference: *2163910340
faq: &2163906600
:path: !ruby/object:Pathname
path: indexfolder/referencfolder/faq.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/referencfolder/faq.txt
:linetext: Frequently Asked Questions
frequently asked questions: *2163906600
appsopen: &2163903160
:path: !ruby/object:Pathname
path: indexfolder/referencfolder/faqfolder/appsopen.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/referencfolder/faqfolder/appsopen.txt
:linetext: Why Do Applications Open Spontaneously?
why do applications open spontaneously?: *2163903160
lineendings: &2163899580
:path: !ruby/object:Pathname
path: indexfolder/referencfolder/faqfolder/lineendings.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/referencfolder/faqfolder/lineendings.txt
:linetext: What's The Big Deal With Line Endings?
what's the big deal with line endings?: *2163899580
reformatting: &2163895900
:path: !ruby/object:Pathname
path: indexfolder/referencfolder/faqfolder/reformatting.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/referencfolder/faqfolder/reformatting.txt
:linetext: Hey, Script Debugger Changed My Formatting!
hey, script debugger changed my formatting!: *2163895900
scriptab: &2163892440
:path: !ruby/object:Pathname
path: indexfolder/referencfolder/faqfolder/scriptab.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/referencfolder/faqfolder/scriptab.txt
:linetext: How Do I Script Script Debugger?
how do i script script debugger?: *2163892440
sediffs: &2163888100
:path: !ruby/object:Pathname
path: indexfolder/referencfolder/faqfolder/sediffs.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/referencfolder/faqfolder/sediffs.txt
:linetext: Is Script Debugger's AppleScript the Same as AppleScript Editor's?
is script debugger's applescript the same as applescript editor's?: *2163888100
whatsinstalledwhere: &2163884400
:path: !ruby/object:Pathname
path: indexfolder/referencfolder/faqfolder/whatsinstalledwhere.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/referencfolder/faqfolder/whatsinstalledwhere.txt
:linetext: What's Installed Where?
what's installed where?: *2163884400
helpglossary: &2163880260
:path: !ruby/object:Pathname
path: indexfolder/referencfolder/helpglossary.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/referencfolder/helpglossary.txt
:linetext: Glossary
glossary: *2163880260
bundledef: &2163876280
:path: !ruby/object:Pathname
path: indexfolder/referencfolder/helpglossaryfolder/bundledef.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/referencfolder/helpglossaryfolder/bundledef.txt
:linetext: ! 'Glossary: Bundle'
! 'glossary: bundle': *2163876280
bytecode: &2163872140
:path: !ruby/object:Pathname
path: indexfolder/referencfolder/helpglossaryfolder/bytecode.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/referencfolder/helpglossaryfolder/bytecode.txt
:linetext: ! 'Glossary: Bytecode'
! 'glossary: bytecode': *2163872140
compiledscriptfile: &2163867820
:path: !ruby/object:Pathname
path: indexfolder/referencfolder/helpglossaryfolder/compiledscriptfile.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/referencfolder/helpglossaryfolder/compiledscriptfile.txt
:linetext: ! 'Glossary: Compiled Script File'
! 'glossary: compiled script file': *2163867820
dictionarydef: &2163862880
:path: !ruby/object:Pathname
path: indexfolder/referencfolder/helpglossaryfolder/dictionarydef.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/referencfolder/helpglossaryfolder/dictionarydef.txt
:linetext: ! 'Glossary: Dictionary'
! 'glossary: dictionary': *2163862880
fork: &2163858380
:path: !ruby/object:Pathname
path: indexfolder/referencfolder/helpglossaryfolder/fork.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/referencfolder/helpglossaryfolder/fork.txt
:linetext: ! 'Glossary: Fork'
! 'glossary: fork': *2163858380
objectmodel: &2163853980
:path: !ruby/object:Pathname
path: indexfolder/referencfolder/helpglossaryfolder/objectmodel.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/referencfolder/helpglossaryfolder/objectmodel.txt
:linetext: ! 'Glossary: Object Model'
! 'glossary: object model': *2163853980
scriptingaddition: &2163848520
:path: !ruby/object:Pathname
path: indexfolder/referencfolder/helpglossaryfolder/scriptingaddition.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/referencfolder/helpglossaryfolder/scriptingaddition.txt
:linetext: ! 'Glossary: Scripting Addition'
! 'glossary: scripting addition': *2163848520
sdefglossary: &2163843280
:path: !ruby/object:Pathname
path: indexfolder/referencfolder/helpglossaryfolder/sdefglossary.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/referencfolder/helpglossaryfolder/sdefglossary.txt
:linetext: ! 'Glossary: Sdef'
! 'glossary: sdef': *2163843280
tellcontext: &2163838780
:path: !ruby/object:Pathname
path: indexfolder/referencfolder/helpglossaryfolder/tellcontext.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/referencfolder/helpglossaryfolder/tellcontext.txt
:linetext: ! 'Glossary: Tell Context'
! 'glossary: tell context': *2163838780
menus:
:path: !ruby/object:Pathname
path: indexfolder/referencfolder/menus.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/referencfolder/menus.txt
:linetext: Menus
applicationmenu: &2163829940
:path: !ruby/object:Pathname
path: indexfolder/referencfolder/menusfolder/applicationmenu.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/referencfolder/menusfolder/applicationmenu.txt
:linetext: Application Menu
application menu: *2163829940
clippingsmenu: &2163826100
:path: !ruby/object:Pathname
path: indexfolder/referencfolder/menusfolder/clippingsmenu.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/referencfolder/menusfolder/clippingsmenu.txt
:linetext: Clippings Menu
clippings menu: *2163826100
dictionarymenu: &2163822480
:path: !ruby/object:Pathname
path: indexfolder/referencfolder/menusfolder/dictionarymenu.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/referencfolder/menusfolder/dictionarymenu.txt
:linetext: Dictionary Menu
dictionary menu: *2163822480
editmenu: &2163818800
:path: !ruby/object:Pathname
path: indexfolder/referencfolder/menusfolder/editmenu.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/referencfolder/menusfolder/editmenu.txt
:linetext: Edit Menu
edit menu: *2163818800
filemenu: &2163813960
:path: !ruby/object:Pathname
path: indexfolder/referencfolder/menusfolder/filemenu.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/referencfolder/menusfolder/filemenu.txt
:linetext: File Menu
file menu: *2163813960
scriptme: &2163809300
:path: !ruby/object:Pathname
path: indexfolder/referencfolder/menusfolder/scriptme.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/referencfolder/menusfolder/scriptme.txt
:linetext: Script Menu
script menu: *2163809300
scriptsmenu: &2163805360
:path: !ruby/object:Pathname
path: indexfolder/referencfolder/menusfolder/scriptsmenu.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/referencfolder/menusfolder/scriptsmenu.txt
:linetext: Scripts Menu
scripts menu: *2163805360
searchme: &2163801360
:path: !ruby/object:Pathname
path: indexfolder/referencfolder/menusfolder/searchme.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/referencfolder/menusfolder/searchme.txt
:linetext: Search Menu
search menu: *2163801360
viewmenu: &2163797960
:path: !ruby/object:Pathname
path: indexfolder/referencfolder/menusfolder/viewmenu.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/referencfolder/menusfolder/viewmenu.txt
:linetext: View Menu
view menu: *2163797960
windowme: &2163794060
:path: !ruby/object:Pathname
path: indexfolder/referencfolder/menusfolder/windowme.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/referencfolder/menusfolder/windowme.txt
:linetext: Window Menu
window menu: *2163794060
preferenc: &2163790520
:path: !ruby/object:Pathname
path: indexfolder/referencfolder/preferenc.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/referencfolder/preferenc.txt
:linetext: Preferences
preferences: *2163790520
applescript: &2163786700
:path: !ruby/object:Pathname
path: indexfolder/referencfolder/preferencfolder/applescript.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/referencfolder/preferencfolder/applescript.txt
:linetext: ! 'Preferences: Fonts & Colors'
! 'preferences: fonts & colors': *2163786700
debugger: &2163782860
:path: !ruby/object:Pathname
path: indexfolder/referencfolder/preferencfolder/debugger.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/referencfolder/preferencfolder/debugger.txt
:linetext: ! 'Preferences: Execution'
! 'preferences: execution': *2163782860
dictionaryprefs: &2163779020
:path: !ruby/object:Pathname
path: indexfolder/referencfolder/preferencfolder/dictionaryprefs.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/referencfolder/preferencfolder/dictionaryprefs.txt
:linetext: ! 'Preferences: Dictionary'
! 'preferences: dictionary': *2163779020
editor: &2163775020
:path: !ruby/object:Pathname
path: indexfolder/referencfolder/preferencfolder/editor.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/referencfolder/preferencfolder/editor.txt
:linetext: ! 'Preferences: Editor'
! 'preferences: editor': *2163775020
general: &2163771280
:path: !ruby/object:Pathname
path: indexfolder/referencfolder/preferencfolder/general.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/referencfolder/preferencfolder/general.txt
:linetext: ! 'Preferences: General'
! 'preferences: general': *2163771280
keybindings: &2163767520
:path: !ruby/object:Pathname
path: indexfolder/referencfolder/preferencfolder/keybindings.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/referencfolder/preferencfolder/keybindings.txt
:linetext: ! 'Preferences: Key Bindings'
! 'preferences: key bindings': *2163767520
softwareupdate: &2163763760
:path: !ruby/object:Pathname
path: indexfolder/referencfolder/preferencfolder/softwareupdate.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/referencfolder/preferencfolder/softwareupdate.txt
:linetext: ! 'Preferences: Software Update'
! 'preferences: software update': *2163763760
textsubstitutions: &2163759980
:path: !ruby/object:Pathname
path: indexfolder/referencfolder/preferencfolder/textsubstitutions.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/referencfolder/preferencfolder/textsubstitutions.txt
:linetext: ! 'Preferences: Text Substitution'
! 'preferences: text substitution': *2163759980
windows:
:path: !ruby/object:Pathname
path: indexfolder/referencfolder/windows.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/referencfolder/windows.txt
:linetext: Windows
toolbar:
:path: !ruby/object:Pathname
path: indexfolder/referencfolder/windowsfolder/toolbar.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/indexfolder/referencfolder/windowsfolder/toolbar.txt
:linetext: Toolbar
toc: &2162794100
:path: !ruby/object:Pathname
path: toc.html
:adr: !ruby/object:Pathname
path: /Users/mattleopard/anger/Word Process/jobs/sd5/sd5docs/toc.txt
:linetext: Table of Contents
table of contents: *2162794100
=end
Can you try with the latest gem, or with edge 1.9.3?
I'd be delighted to. Let me give it a shot.
Installed the gem, started the script this way:
gem 'psych', '1.3.4'
require 'yaml'
p Psych::VERSION #=> "1.3.4"
So if I understand correctly we are using the gem. No faster. More to follow...
Tried with ruby 2.0.0dev (2012-09-15 trunk 36975) [x86_64-darwin10.8.0]. Psych is a little faster: about 13.5 seconds, as opposed to the previous 17 or 18 seconds. But we are still not operating at anything like the speed of Syck (5 seconds). I can't test with Syck under ruby 2 as it isn't there (we neatly fall back to Psych).
@tenderlove We are also dealing with really slow performance of psych vs sych with an app upgraded to 1.9.3. Any status update on this? Any plans to implement this as a c-based lib again?
Well, it uses libyaml, so it is already a c based library. The question is where the perf bottleneck is. I suspect it's libyaml's parser, but I'm not certain.
Please forgive my ignorance, and thank you for the details. I came across references that refer to psych as "pure ruby".
@kevinrood don't worry about it! I need to research the libyaml parser more closely.
Here's ruby-prof output from my example. First under Psych (first 25 lines only):
%self total self wait child calls name
9.29 10.30 10.30 0.00 0.00 2120100 Regexp#===
8.64 28.41 9.58 0.00 18.83 450600 Psych::ScalarScanner#tokenize
4.68 5.19 5.19 0.00 0.00 450600 Psych::Nodes::Scalar#initialize
4.04 16.67 4.48 0.00 12.19 764700 *Class#new
3.99 33.28 4.42 0.00 28.86 450600 Psych::Visitors::ToRuby#deserialize
3.81 27.71 4.22 0.00 23.49 300 Psych::Parser#parse
3.62 5.13 4.02 0.00 1.12 46200 Kernel#Integer
3.51 13.72 3.89 0.00 9.83 450600 Psych::TreeBuilder#scalar
2.90 3.21 3.21 0.00 0.00 856800 <Class::BasicObject>#allocate
2.86 38.94 3.17 0.00 35.78 450600 Psych::Visitors::ToRuby#visit_Psych_Nodes_Scalar
2.26 2.50 2.50 0.00 0.00 450600 Psych::Visitors::ToRuby#register
1.85 2.05 2.05 0.00 0.00 474304 Hash#[]=
1.73 1.92 1.92 0.00 0.00 692400 String#===
1.54 1.71 1.71 0.00 0.00 624604 Kernel#hash
1.54 1.71 1.71 0.00 0.00 624600 Kernel#class
1.54 1.71 1.71 0.00 0.00 624600 Hash#empty?
1.44 2.21 1.59 0.00 0.62 138900 Psych::Nodes::Mapping#initialize
1.41 7.09 1.57 0.00 5.52 92400 Psych::Visitors::ToRuby#init_with
1.34 1.48 1.48 0.00 0.00 543000 String#empty?
1.32 6.20 1.47 0.00 4.73 138900 Psych::TreeBuilder#start_mapping
1.31 1.45 1.45 0.00 0.00 92400 Psych::Coder#initialize
1.26 1.40 1.40 0.00 0.00 450600 Hash#key?
1.20 33.74 1.33 0.00 32.42 92400 Psych::Visitors::ToRuby#revive
1.18 2.06 1.31 0.00 0.75 139200 Psych::TreeBuilder#pop
1.02 1.73 1.13 0.00 0.59 92400 Psych::Visitors::ToRuby#resolve_class
Now under Syck (first 11 lines only):
%self total self wait child calls name
23.50 8.75 3.61 0.00 5.14 231000 Syck::Resolver#transfer
22.24 15.31 3.42 0.00 11.90 300 Syck::Parser#load
19.88 11.81 3.05 0.00 8.75 589500 <Object::Syck::Resolver>#node_import
10.98 2.52 1.69 0.00 0.83 138600 <Class::Symbol>#yaml_new
7.42 1.14 1.14 0.00 0.00 415800 Kernel#respond_to_missing?
2.88 0.44 0.44 0.00 0.00 138600 String#intern
2.74 0.42 0.42 0.00 0.00 92400 <Class::Object>#yaml_tag_subclasses?
2.66 0.41 0.41 0.00 0.00 92400 Hash#each
2.54 0.39 0.39 0.00 0.00 138600 Module#===
2.42 0.37 0.37 0.00 0.00 92400 Module#yaml_tag_read_class
1.81 0.28 0.28 0.00 0.00 92400 <Class::BasicObject>#allocate
I'm seeing very similar performance issues and I think I narrowed it down. As noted in the profile trace above, there's a very high number of RexExp matches being performed as part of the tokenization process. Basically, if you have a String that doesn't start with [A-Za-z~], you're going to perform 10 failed RegExp matches and then potentially a failed cast to an Integer (depends on whether the String contains less than two '.' characters). Incidentally, every single one of those path values above has a single '.' and as such, an Integer is attempted to be created from it and fails.
The easiest solution is to short-circuit all that. Since the parse order matters in order to guarantee a proper match, the short-circuit code is a bit ugly. As far as I can tell, it boils down to one of two approaches: look for a character you know would fail any of the matches or look for just a different starting character than the other matches look for. The former would yield the fewest number of comparisons in the case of the YAML above, but is indeed ugly.
By changing the first when clause from when /^[A-Za-z~]/
to when /^[A-Za-z~]/, /^[^:-][\D\s\(\)!\?\{\}\/\\]+/
, I managed to reduce loading of the above file roughly 3x. Running benchmark, loading the file 300 times, I saw:
user system total real load YAML 20.160000 0.020000 20.180000 ( 20.236022) user system total real load YAML 6.500000 0.040000 6.540000 ( 6.560076)
Basically the second regular expression looks for anything that doesn't start the characters ":" or "-" and then consists of a string of characters that have a space, parenthesis, curly braces, non-digits, and some punctuation. Basically characters that would make it look distinctly different from a date, a float, an int, special floats like Infinity, and so on.
I guess the downside is for all other non-String types, you'd have one extra RegExp failed match. So, a YAML loaded with dates would be marginally slower. But I think the gain here is quite substantial for the common cases of loading up gemspecs and VCR cassettes.
It probably goes without saying, but implementing the above change locally removed Psych completely as a hotspot from some of my more involved VCR tests.
And finally, as grotesque as my proposed solution is, it's not unprecedented. The early String handling code does a sub-case statement where it's first check is that the string isn't a Boolean or nil value (and it took me way too long to figure out that that's what it's doing :-P)
Other suggestions are appreciated.
@nirvdrum That first where clause was put there to short circuit the rest of the tests. I know your regexp is ugly, but I'm fine with adding ugly code in that spot to prevent so many tests.
Great. How solid are the tests for all the other cases? I obviously wouldn't want to inadvertently break parsing in general.
I can pull together a pull request. As of now, I do have two test failures. I was sorta just mucking around to see what I could do with the example YAML above. If fixing those two is good enough though, I could have that wrapped up tonight. If more testing is needed, I guess we'll need to develop the test cases.
@nirvdrum I am very confident in the tests. I'll test against Rails or something, but all the nasty branches in the scanner were tdd'd, so I'm not worried that you'll break anything.
I'm liking where you're going with this! Thx.
@mattneub If you wouldn't mind checking out psych master and verifying it speeds up for you, that'd be great. Unfortunately, the performance here is more probabilistic based upon common usage patterns than something that could be improved across the board.
@nirvdrum It's better in my actual use case (11 seconds instead of 14 seconds) but not as good as Ruby 1.8.7/sych (9 seconds). I'm currently working around this by using yaml less often...
@mattneub Using the above YAML file? Or do you have a more dastardly one?
The timings I just gave are for an actual real-world process in my RubyFrontier web framework. It was the slowdown in this particular operation when switching to Ruby 1.9.3 that alerted me to the issue in the first place. You asked for "common usage patterns" so I tested with my actual usage. YAML is not the only thing that happens in that process, of course; I'm just trying to give a sense of what difference the RegExp change makes. It definitely makes a difference!
Okay. No worries. I'm just trying to see if I could tune any more. I drew from my own app and the YAML file you have above but that's not a huge sample. If you could do another profile trace, that'd be quite helpful.
Well, you already know that running my original test script with caveman timings, Psych with your modifications is still much slower than Syck. I rewrote your VERSION string as "1.3.4b" so as to be certain that we are using your changes:
gem 'psych'
require 'yaml'
h1 = h2 = nil
f = Pathname.new(__FILE__).dirname + "autoglossary.yaml"
YAML::ENGINE.yamler = 'psych'
t = Time.new.to_f
300.times {h1 = YAML.load_file(f)}
puts "Psych #{YAML::VERSION}", Time.new.to_f - t
YAML::ENGINE.yamler = 'syck'
t = Time.new.to_f
300.times {h2 = YAML.load_file(f)}
puts "Syck #{YAML::VERSION}", Time.new.to_f - t
puts "Resulting loaded hash the same? #{h1 == h2}"
Output:
Psych 1.3.4b
12.906046390533447
Syck 0.60
5.742939710617065
Resulting loaded hash the same? true
So we are still a long way from the speed of Syck. A new profile starts like this:
Thread ID: 2151954760
Total: 102.067805
Sort by: self_time
%self total self wait child calls name
8.43 20.01 8.60 0.00 11.41 450600 Psych::ScalarScanner#tokenize
8.06 8.23 8.23 0.00 0.00 1704300 Regexp#===
5.26 5.37 5.37 0.00 0.00 450600 Psych::Nodes::Scalar#initialize
4.38 24.93 4.47 0.00 20.47 450600 Psych::Visitors::ToRuby#deserialize
4.18 15.97 4.27 0.00 11.71 718500 *Class#new
3.88 13.62 3.96 0.00 9.66 450600 Psych::TreeBuilder#scalar
3.61 27.27 3.69 0.00 23.59 300 Psych::Parser#parse
3.11 30.62 3.18 0.00 27.45 450600 Psych::Visitors::ToRuby#visit_Psych_Nodes_Scalar
2.63 2.68 2.68 0.00 0.00 810600 <Class::BasicObject>#allocate
2.46 2.52 2.52 0.00 0.00 450600 Psych::Visitors::ToRuby#register
1.89 1.93 1.93 0.00 0.00 692400 String#===
1.76 1.80 1.80 0.00 0.00 474304 Hash#[]=
1.70 1.74 1.74 0.00 0.00 624600 Kernel#class
1.70 1.73 1.73 0.00 0.00 624600 Hash#empty?
1.70 1.73 1.73 0.00 0.00 624604 Kernel#hash
1.60 2.29 1.63 0.00 0.66 138900 Psych::Nodes::Mapping#initialize
1.56 7.13 1.59 0.00 5.54 92400 Psych::Visitors::ToRuby#init_with
1.47 1.50 1.50 0.00 0.00 543000 String#empty?
So we've moved Regexp#=== down the list a little, and this has the effect of shaving some time off of other calls too, but we are still spending a lot of time in the scanner/parser. It might be more revealing to use ruby-prof's graphing printer which displays call nesting.
Thanks. I was using perftools.rb, but seeing timings nowhere near yours. Raw time is relative to the hardware being run on. So the profile timings help more with cross-referencing. In my case, I was seeing psych handle that file in about 6 seconds. I'll dig a little deeper.
I can't explain the discrepancy. It's possible I've done something wrong with the installation, but I did download from master and rake gem and gem install, and the gem is in place and the version number is reported correctly, so I do believe I'm using your code (and I can see the changed "when" test). Maybe contact me offline and we can coordinate our tests?
Sounds good. I tried to find your contact info but was unable to do so. Please feel free to e-mail me at [email protected].
Hi,
I wanted to bring some (anecdotal) evidence for the true slowness we encountered. I had read this post before switching from Syck to Psych; but I assumed the impact would be minimal. Oh boy where we wrong.
This is a Rails 3.2.8 app. We serialize quite a lot of stuff in the DB; so at least each request there are several YAML conversions executed.
- ruby 1.9.3p194 (Debian)
- Psych::VERSION => "1.3.2" stdlib
- Psych.libyaml_version => 0.1.4
I don't know if this is helpful, or if you'd like me to collect some more info?
@Bertg Yes, psych is slower than syck but you're running into a fixed performance bug.
ruby 1.9.3p194 had a very slow psych library (version 1.3.2) due to a bug. It was fixed here: https://github.com/tenderlove/psych/commit/0845b0781abeac81132594c5cebf2630cb18933d and released in psych 1.3.3.
An example benchmark: https://gist.github.com/2936844
Install Ruby 1.9.3-p327 or p286 which included this fix or upgrade to the psych 1.3.3+ gem and retry your performance comparison.
@jrafanie That doesn't make any difference. My test, quoted at the start of this Issue, running under Ruby 1.9.3-p327 and psych 1.3.4, yields:
Psych 1.3.4
18.122817993164062
Syck 0.60
5.312050104141235
Resulting loaded hash the same? true
So Psych is still taking over 3 times as long to perform the same task. Nothing has changed here.
That's not strictly true. Psych has different performance characteristics depending on the structure of the underlying file. We've been trying to normalize that. But without seeing @Bertg's file it's not possible to say one way or another. For some file structures it is faster, for others there's no difference.