Skip to content

Instantly share code, notes, and snippets.

@shirosaki
Created December 6, 2011 05:37
Show Gist options
  • Save shirosaki/1436902 to your computer and use it in GitHub Desktop.
Save shirosaki/1436902 to your computer and use it in GitHub Desktop.
file_load_ok performance improvement for Windows
diff --git a/file.c b/file.c
index e566ce3..516225d 100644
--- a/file.c
+++ b/file.c
@@ -5060,7 +5060,33 @@ static int
file_load_ok(const char *path)
{
int ret = 1;
- int fd = open(path, O_RDONLY);
+ int fd;
+#ifdef _WIN32
+ static int use_attribute = -1;
+ if (use_attribute == -1) {
+ if (getenv("RUBY_USE_ATTRIBUTE") == NULL) {
+ use_attribute = 0;
+ }
+ else {
+ use_attribute = 1;
+ }
+ }
+ if (use_attribute) {
+ DWORD attr = GetFileAttributes(path);
+ if (attr == INVALID_FILE_ATTRIBUTES ||
+ attr & FILE_ATTRIBUTE_DIRECTORY) {
+ return 0;
+ }
+ else {
+ return ret;
+ }
+ }
+ else {
+ fd = open(path, O_RDONLY);
+ }
+#else
+ fd = open(path, O_RDONLY);
+#endif
if (fd == -1) return 0;
rb_update_max_fd(fd);
#if !defined DOSISH
@shirosaki
Copy link
Author

Benchmark result on Windows XP 32bit

### NOD32 Antivirus Real-time file system protection OFF

C:\devruby\measurements>set RUBY_USE_ATTRIBUTE=

C:\devruby\measurements>rci bench core_require_empty
ruby 1.9.3p5 (2011-11-30) [i386-mingw32]
Rehearsal ------------------------------------------------------
core_require_empty   0.812000  13.406000  14.218000 ( 14.265625)
-------------------------------------------- total: 14.218000sec

                         user     system      total        real
core_require_empty   0.938000  13.203000  14.141000 ( 14.265625)

C:\devruby\measurements>set RUBY_USE_ATTRIBUTE=1

C:\devruby\measurements>rci bench core_require_empty
ruby 1.9.3p5 (2011-11-30) [i386-mingw32]
Rehearsal ------------------------------------------------------
core_require_empty   0.641000  11.188000  11.829000 ( 11.937500)
-------------------------------------------- total: 11.829000sec

                         user     system      total        real
core_require_empty   0.640000  11.500000  12.140000 ( 12.328125)

C:\devruby\rails_test>set RUBY_USE_ATTRIBUTE=

C:\devruby\rails_test>timer ruby -rfenix/replace script\rails r "p 1"
1
real    10.718
system  2.437
user    7.343

C:\devruby\rails_test>timer ruby -rfenix/replace script\rails r "p 1"
1
real    10.359
system  2.515
user    7.093

C:\devruby\rails_test>set RUBY_USE_ATTRIBUTE=1

C:\devruby\rails_test>timer ruby -rfenix/replace script\rails r "p 1"
1
real    8.968
system  1.093
user    7.078

C:\devruby\rails_test>timer ruby -rfenix/replace script\rails r "p 1"
1
real    9.156
system  0.843
user    7.296



### NOD32 Antivirus Real-time file system protection ON

C:\devruby\measurements>set RUBY_USE_ATTRIBUTE=

C:\devruby\measurements>rci bench core_require_empty
ruby 1.9.3p5 (2011-11-30) [i386-mingw32]
Rehearsal ------------------------------------------------------
core_require_empty   0.954000  22.219000  23.173000 ( 23.765625)
-------------------------------------------- total: 23.173000sec

                         user     system      total        real
core_require_empty   1.000000  22.250000  23.250000 ( 25.796875)

C:\devruby\measurements>set RUBY_USE_ATTRIBUTE=1

C:\devruby\measurements>rci bench core_require_empty
ruby 1.9.3p5 (2011-11-30) [i386-mingw32]
Rehearsal ------------------------------------------------------
core_require_empty   0.844000  12.110000  12.954000 ( 13.406250)
-------------------------------------------- total: 12.954000sec

                         user     system      total        real
core_require_empty   0.796000  12.000000  12.796000 ( 13.328125)

C:\devruby\rails_test>set RUBY_USE_ATTRIBUTE=

C:\devruby\rails_test>timer ruby -rfenix/replace script\rails r "p 1"
1
real    19.968
system  10.781
user    8.031

C:\devruby\rails_test>timer ruby -rfenix/replace script\rails r "p 1"
1
real    19.281
system  10.484
user    7.546

C:\devruby\rails_test>set RUBY_USE_ATTRIBUTE=1

C:\devruby\rails_test>timer ruby -rfenix/replace script\rails r "p 1"
1
real    9.984
system  1.687
user    7.203

C:\devruby\rails_test>timer ruby -rfenix/replace script\rails r "p 1"
1
real    10.328
system  1.328
user    7.734

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment